6

我知道为什么不允许这样做:

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

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

运算符“<”不能应用于“ulong”和“long”类型的操作数。

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

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);

<接受 aulong并没有过载long,但我在 Reflector 中看到它会默默地转换Int64.MaxValue为 a ulong。但这并不总是发生。它是如何工作的,这种不一致的原因是什么?

4

2 回答 2

3

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

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

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

于 2012-07-27T00:10:50.047 回答
1

具有 ulong 范围内的值的 const long 静默转换为 const ulong。

这是允许的:

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

const ulong z = y;
于 2012-07-27T00:06:23.040 回答