基于这个有趣的问题:Addition of int and uintNicholas Carey's answer中提到的不断折叠的玩弄,我偶然发现了编译器的看似不一致的行为:

考虑以下代码片段:

int i = 1;
uint j = 2;
var k = i - j;

在这里,编译器将k正确解析为long。如前面提到的问题的答案中所述,此特殊行为在规范中已得到很好的定义。

使我感到惊讶的是,当处理文字常量或一般常量时,行为会发生变化。阅读Nicholas Carey的answer,我意识到行为可能会不一致,因此我检查并确定足够:
const int i = 1;
const uint j = 2;
var k = i - j; //Compile time error: The operation overflows at compile time in checked mode.
k = 1 - 2u; //Compile time error: The operation overflows at compile time in checked mode.

在这种情况下,k解析为Uint32

在处理常量时,是否有行为不同的原因,或者这是编译器中的一个小而不幸的“错误”(缺少更好的术语)吗?

最佳答案

C# specification version 5第6.1.9节中,常量表达式仅允许以下隐式转换



请注意,long不在int转换列表中。

问题的另一半是二进制运算仅发生少量的数字提升:

(摘自第7.3.6.2节二进制数值促销):



注意:常量不允许将int转换为long,这意味着将两个arg都提升为uint

关于c# - 减去uint和int并不断折叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26386201/

10-13 09:23