C# 为关键字var计算的不同类型
我有以下两段代码,旨在推断编译器分配给C# 为关键字var计算的不同类型,c#,.net,types,var,C#,.net,Types,Var,我有以下两段代码,旨在推断编译器分配给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(
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?编译器会自动将类型扩展到64位,因为这是唯一可以保存UInt32
和Int32
之间的运算结果的整数。试着换成
ulong val1 = 0x80000000;
long val2 = 0x1;
您将看到编译错误,因为编译器找不到保存结果的类型
Int64
不是b
的推断类型,因为编译器检测到常量属于Int32
范围。试一试
var b = 0x800000000000 - 0x1;
您将看到推断类型long
,因为
var b=0x8000000-0x1代码>
已经计算了。通过优化
但是
还没有计算。编译器猜测val1
和val2
可能会在以后更改
const uint val1 = 0x80000000;
const int val2 = 0x1;
var c = val1 - val2;
c
现在是UInt32
,因为编译器计算它并知道结果
因为val1
和val2
是常量,编译器知道它们不会被更改。因此不再需要Int64
问题是,当您在int
和uint
之间执行操作时,uint
正在以有符号的数字进行转换
因此,为了使uint
能够以无符号数存储其所有信息(从0到23-1),必须将其转换为long
(从-263到263-1),因为int
的范围是从-231到231-1,然后你必须考虑结果会被签署的可能性。您还必须考虑结果大于Int32
的可能性。那么你有什么选择?提示:Int64
将是唯一可以处理val1-val2
@MattBurland的所有可能值的类型:是的,正确!但是为什么编译器在varb
过程中不“思考”这个问题呢?注意,varb可以在编译过程中进行计算,这个等式甚至不会写入代码中。它与var c的作用不同,var c作用于变量,这些变量使其成为编译代码。@NirajDoshi:因为在第一种情况下,您要减去两个文本。它们是恒定的。结果可以在编译时计算。但是,这同样意味着代码的var b
部分。在编辑(0x8000000000)之后,这是显而易见的,因为您正在执行Int64-INT32。如果您确定在编译期间计算它,我必须接受它作为答案。你能提供进一步的阅读链接吗?谢谢@NirajDoshi
const uint val1 = 0x80000000;
const int val2 = 0x1;
var c = val1 - val2;