checked および unchecked ステートメント (C# リファレンス)
checked
および unchecked
ステートメントを使って、整数型の算術演算および変換に対するオーバーフローチェック コンテキストを指定します。 整数の算術オーバーフローが発生した場合、オーバーフローチェック コンテキストによって動作を定義します。 checked コンテキストでは、System.OverflowException がスローされます。定数式でオーバーフローが発生すると、コンパイル時のエラーが発生します。 unchecked コンテキストでは、結果の格納先の型に収まらない上位ビットが破棄されて、演算結果が切り詰められます。 たとえば、加算の場合は、最大値から最小値に切り下げられます。 次の例は、checked と unchecked の両方のコンテキストで行った同じ演算を示しています。
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 3); // output: 2
}
try
{
checked
{
Console.WriteLine(a + 3);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
注意
オーバーフローが発生した場合の "ユーザー定義" の演算子と変換の動作は、前の段落で説明したものと異なる場合があります。 特に、ユーザー定義の checked 演算子は、checked コンテキストで例外をスローしない可能性があります。
詳細については、算術演算子に関する記事の「算術オーバーフローと 0 による除算」と「ユーザー定義の checked 演算子」のセクションを参照してください。
式のオーバーフロー チェック コンテキストを指定するには、次の例に示すように、checked
と unchecked
の演算子を使用することもできます。
double a = double.MaxValue;
int b = unchecked((int)a);
Console.WriteLine(b); // output: -2147483648
try
{
b = checked((int)a);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
checked
と unchecked
のステートメントと演算子は、次の例に示すように、ステートメント ブロックまたは演算子のかっこ内で "テキストとして表示される" 演算子のオーバーフロー チェック コンテキストにのみ影響します。
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
前の例の Multiply
ローカル関数の最初の呼び出しは、例外がスローされないため、checked
ステートメントが Multiply
関数内のオーバーフロー チェック コンテキストに影響しないことを示しています。 Multiply
関数の 2 番目の呼び出しでは、関数の 2 番目の引数を計算する式が checked コンテキストで評価され、その結果、例外となります。これは、checked
ステートメントのブロック内にテキストとして表示されているためです。
オーバーフロー チェック コンテキストの影響を受ける演算
オーバーフロー チェック コンテキストは、次の演算に影響します。
次の組み込みの算術演算: オペランドが整数型である (つまり、整数数値または char 型である) か、enum 型である場合、単項
++
、--
、-
、および二項+
、-
、*
、および/
演算。整数型間か、
float
またはdouble
から整数型への明示的な数値変換。注意
decimal
値を整数型に変換し、結果が格納先の型の範囲外にある場合、OverflowException はオーバーフロー チェック コンテキストに関係なく、常にスローされます。C# 11 以降では、ユーザー定義の checked 演算子と変換。 詳細については、算術演算子に関する記事の「ユーザー定義のチェック演算子」セクションを参照してください。
既定のオーバーフロー チェック コンテキスト
オーバーフロー チェック コンテキストを指定しない場合、CheckForOverflowUnderflow コンパイラ オプションの値によって、非定数式の既定のコンテキストが定義されます。 既定では、そのオプションの値が設定解除され、整数型の算術演算と変換が unchecked コンテキストで実行されます。
定数式は既定では checked コンテキストで評価され、オーバーフローの場合はコンパイル時のエラーが発生します。 unchecked
ステートメントまたは演算子を使用して、定数式の unchecked コンテキストを明示的に指定できます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
関連項目
.NET