为关键字var评估的不同类型
本文关键字:同类型 评估 关键字 var | 更新日期: 2023-09-27 18:00:06
我有以下两块代码,旨在推断编译器分配给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?
因为
var b = 0x80000000 - 0x1;
已计算。通过优化
但是
var val1 = 0x80000000;
var val2 = 0x1;
var c = val1 - val2;
尚未计算。并且编译器猜测CCD_ 6和CCD_。。。
const uint val1 = 0x80000000;
const int val2 = 0x1;
var c = val1 - val2;
c
现在是UInt32
,因为编译器计算它并知道重结果。
因为val1
和val2
是常量,编译器知道它们不会被更改。因此不再需要CCD_ 12
问题是,当您在int
和uint
之间执行操作时,uint
将转换为带符号的数字。
因此,为了使uint
能够将其所有信息(从0到23-1)存储在无符号数中,它必须被广播到long
(从-263到263-1),因为int
的范围是从-231至231-1。
编译器会自动将类型扩展到64位,因为这是唯一可以保存UInt32
和Int32
之间运算结果的整数。尝试更改为
ulong val1 = 0x80000000;
long val2 = 0x1;
您将看到编译错误,因为编译器找不到保存结果的类型。
Int64
不是b
的推断类型,因为编译器检测到常量落入Int32
范围。尝试
var b = 0x800000000000 - 0x1;
您将看到推断类型long