以下代码显示UInt32
:
var myUint = 1U;
Console.WriteLine(myUint.GetType().Name);
按照this的答案,我想看看如果您尝试使用带有编译时负数的U
文字后缀,将会发生什么。此代码(将1U
更改为-1U
)将打印Int64
(long
):
var myUint = -1U;
Console.WriteLine(myUint.GetType().Name);
我认为这只是一个编译时错误,但是返回一个值为long
的{{1}}-怎么回事?为什么编译器会这样做?
答案 0 :(得分:3)
减号不是整数文字说明的一部分。因此,当您编写var x = -1U
时,编译器将应用以下规则:
如果文字以U或u为后缀,则具有可以表示其值的第一种类型:
uint
,ulong
。
因此,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;