【发布时间】:2015-09-14 02:43:52
【问题描述】:
我有以下 2 块代码,旨在推断编译器分配给 var 关键字的类型。
var b = 0x80000000 - 0x1;
Console.WriteLine("b: {0}", b);
Console.WriteLine("b.GetType()={0}", b.GetType());
uint val1 = 0x80000000;
int val2 = 0x1;
var c = val1 - val2;
Console.WriteLine("c: {0}", c);
Console.WriteLine("c.GetType(): {0}", c.GetType());
输出:
b: 2147483647 //Result of UInt32-Int32
//(as compiler assigns datatype in the
//order of int, uint, long and ulong)
b.GetType()=System.UInt32 //OK
c: 2147483647 //Uint32-Int32
c.GetType(): System.Int64 //Not Understood, why not UInt32 ?
如果var b 和var c 具有几乎相同的初始化——var c 甚至是显式的,那么为什么它会给出意外的数据类型 System.Int64?
【问题讨论】:
-
如果你从一个无符号整数中减去一个有符号整数,那么你必须考虑结果将被签名的可能性。您还必须考虑结果大于
Int32的可能性。那么你有什么选择呢?提示:Int64将是唯一可以处理val1 - val2的所有可能值的类型。 -
@MattBurland:是的,没错!但是为什么编译器在
var b期间没有“思考”这个问题 -
请注意, var b 可以在编译期间计算,等式甚至不会进入代码。它与 var c 的作用不同,后者作用于将其纳入编译代码的变量。
-
@NirajDoshi:因为在第一种情况下,您要减去两个 literals。它们是恒定的。结果可以在编译时计算出来。