Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为关键字var计算的不同类型_C#_.net_Types_Var - Fatal编程技术网

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;