UInt奇怪的编译时行为-返回Long。

时间:2018-10-11 08:33:23

标签: c# .net

以下代码显示UInt32

var myUint = 1U;
Console.WriteLine(myUint.GetType().Name);

按照this的答案,我想看看如果您尝试使用带有编译时负数的U文字后缀,将会发生什么。此代码(将1U更改为-1U)将打印Int64long):

var myUint = -1U;
Console.WriteLine(myUint.GetType().Name);

我认为这只是一个编译时错误,但是返回一个值为long的{​​{1}}-怎么回事?为什么编译器会这样做?

2 个答案:

答案 0 :(得分:3)

减号不是整数文字说明的一部分。因此,当您编写var x = -1U时,编译器将应用以下规则:

  

如果文字以U或u为后缀,则具有可以表示其值的第一种类型:uintulong

因此,1U部分变成了uint / UInt32,到目前为止符合您的期望。

但随后应用减号:

  

对于格式为-x的操作,一元运算符重载解析(第7.3.3节)适用于选择特定的运算符实现。操作数将转换为所选运算符的参数类型以及结果的类型   是运算符的返回类型。预定义的求反运算符为:

     
      
  • 整数取反:

         

    int operator -(int x);

         

    long operator -(long x);

  •   
     

[...]

     

如果求反运算符的操作数的类型为uint,则将其转换为long类型,结果的类型为long。

因此,根据C#规范,表达式-1U的类型为long。然后,它变成x的类型。

答案 1 :(得分:0)

显然-1U无法存储为uint。由于使用var,因此编译器会推导类型以保存值。由于您要保留-(1为无符号整数),因此编译器决定将其存储为长时间。

如果您明确定义类型,则会出现编译时错误:

uint myUint = -1U;