基于这个有趣的问题:添加 int 和 uint并玩弄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
.
处理常量时行为不同是否有原因,或者这是编译器中的一个小但不幸的“错误”(缺乏更好的术语)?