为关键字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 bvar c具有几乎相同的初始化——其中var c甚至是显式的,那么为什么它会给出意外的数据类型System.Int64?

为关键字var评估的不同类型

因为

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,因为编译器计算它并知道重结果。

因为val1val2是常量,编译器知道它们不会被更改。因此不再需要CCD_ 12

问题是,当您在intuint之间执行操作时,uint将转换为带符号的数字。

因此,为了使uint能够将其所有信息(从0到23-1)存储在无符号数中,它必须被广播到long(从-263到263-1),因为int的范围是从-231至231-1。

编译器会自动将类型扩展到64位,因为这是唯一可以保存UInt32Int32之间运算结果的整数。尝试更改为

ulong val1 = 0x80000000;
long val2 = 0x1;

您将看到编译错误,因为编译器找不到保存结果的类型。

Int64不是b的推断类型,因为编译器检测到常量落入Int32范围。尝试

var b = 0x800000000000 - 0x1;

您将看到推断类型long