基于这个有趣的问题:Addition of int and uint,并按照Nicholas Carey的答案中提到的对于常量折叠进行试验,我发现编译器似乎表现不一致:
在这里,编译器正确地将
令我感到惊讶的是,在处理文字常量或常量时,该行为会发生变化。阅读Nicholas Carey的答案后,我意识到行为可能是不一致的,因此我进行了检查,并且果然如此:
考虑下面的代码片段:
int i = 1;
uint j = 2;
var k = i - j;
在这里,编译器正确地将
k
解析为long
。这种特定的行为在规范中得到了明确定义,如先前引用问题的答案所解释的那样。令我感到惊讶的是,在处理文字常量或常量时,该行为会发生变化。阅读Nicholas Carey的答案后,我意识到行为可能是不一致的,因此我进行了检查,并且果然如此:
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
。
处理常量时行为不同的原因是什么?还是这是编译器中的一个小但不幸的“bug”(没有更好的术语)?
int
隐式转换为uint
,所以必须这样做。 - InBetweensbyte
、byte
、short
、ushort
、uint
或ulong
,前提是常量表达式的值在目标类型的范围内。" 仍在努力查找它对字面值和/或常量变量的说明。 - Powerlord