以下のコードを参照してください。その背後にある理由を理解したいだけです...
const int a = 2147483647;
const int b = 2147483647;
int c = a + b; // it doesn't allow to compile!!!
int a = 2147483647;
int b = 2147483647;
int c = a + b; // it allows to compile!!!
const
式はコンパイル時に解決され、非const
式は実行時に解決されます。デフォルトでは、それぞれに異なるタイプのオーバーフロー チェック コンテキストがあります。C# 仕様によると:
チェックまたはチェックされていない演算子またはステートメントで囲まれていない非定数式 (実行時に評価される式)の場合、 外部要因 (コンパイラ スイッチや実行環境の構成など) によって呼び出されない限り、既定のオーバーフロー チェック コンテキストはチェックされません。チェック評価。
これが、ローカル変数を使用して算術を行うときに実行時エラーが発生しない理由です。const
計算に関しては:
定数式 (コンパイル時に完全に評価できる式)の場合、デフォルトのオーバーフロー チェック コンテキストは常に checkedです。定数式がチェックされていないコンテキストに明示的に配置されていない限り、式のコンパイル時の評価中に発生するオーバーフローは常にコンパイル時エラーを引き起こします。
const
これが、計算でコンパイル時エラーが発生する理由です。
定数値の場合、コンパイラーは基本的に、コンパイル時に変数を定数値に置き換えます。したがって、コンパイル時に加算ステートメントを評価すると、値を認識してオーバーフロー状態を確認できます。
整数型変数の場合、コンパイラーはコンパイル時に割り当てられた値を実際に考慮に入れるのではなく、実行時に式を評価すると思います。
しかし、C#は、チェックがデフォルトで無効になっていることがわかりました。オプションでオンにできます。理由と方法については、JustinEtheredgeの優れたブログ投稿を参照してください。
コンパイラーはconst
変更できないことを知っているのでa+b
失敗すると思います。ただし、他の変数を使用すると、実行時に変更できるため、コンパイラーは、設定された値が有効な値に変更されないと想定しません。