c# - ulong 和 long 之间不可能的比较突然成为可能

标签 c# casting long-integer comparison-operators

我知道为什么这是不允许的:

ulong x = 0xFEDCBA9876543210;
long y = Int64.MaxValue;
Console.WriteLine(x < y);

显然,运行时无法将任一操作数隐式转换为其他类型或更大的类型来进行比较。

Operator '<' cannot be applied to operands of type 'ulong' and 'long'.

因此,这也是不允许的(使用 MinValueconst ):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MinValue;
Console.WriteLine(x < y);

然而,这是允许的(使用 MaxValue 代替):

ulong x = 0xFEDCBA9876543210;
const long y = Int64.MaxValue;
Console.WriteLine(x < y);

< 没有重载接受ulonglong , 但我用 Reflector 看到这会默默地转换 Int64.MaxValueulong .但这并不总是发生。它是如何工作的,造成这种不一致的原因是什么?

最佳答案

long y = Int64.MaxValue; if (x < y)... 之间的一大区别和 if (x < Int64.MaxValue)是在后一种情况下,如果需要,编译器实际上可以看到常量值。它可以看到实际常量值在 ulong 范围内,因此可以进行隐式转换。

对于普通变量 long y ,编译器无法对 y 的运行时值做出任何假设。没关系,赋值语句只是一个语句;编译器不会跟踪分配给变量的值。

正如 DarkGray 所指出的,const var 表现为常量,因为您已经告诉编译器它的值永远不会改变。

关于c# - ulong 和 long 之间不可能的比较突然成为可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679708/

相关文章:

c# - 训练 tesseract 后 tessdata 文件夹中应该包含哪些文件?

c# - 如何将 LateX/Math 添加到 Windows 10 Ink API?

c# - 无法加载文件或程序集 Microsoft.ReportViewer.WebForms 或其依赖项之一

java - 如何将 long 转换为毫秒

c# - 将 Float 转换为 Long 给出负值

c# - 在 Configure 方法中使用 DependencyInjection

c++ - 如何将 uint8_t 放入 char 数组中?

Mysql 将 varchar 视为 int 错误?

java - 如何调用需要 Class<T> 对象作为参数的方法?

从 unsigned long int 转换为 signed int,反之亦然