この興味深い質問に基づいて: Nicholas Carey's answerに記載されているように、int と uint を追加し、一定の折り畳みをいじくり回すと、一見一貫性のないコンパイラの動作に遭遇しました。
次のコード スニペットを検討してください。
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
ます。
定数を扱うときに動作が異なる理由はありますか、それともこれはコンパイラの小さいながらも不幸な「バグ」(より適切な用語の欠如) ですか?