5

LinqPad を使用して何かをテストしていたところ、次のコードが例外を生成しなかったことに驚きました。

ulong lSmallValue = 5;
ulong lBigValue = 10;

ulong lDifference = lSmallValue - lBigValue;

Console.WriteLine(lDifference);
Console.WriteLine((long)lDifference);

これにより、次の出力が生成されます。

18446744073709551611
-5

幸いなことに、私はこの動作を望んでいましたが、これによりOverflowExceptionがスローされると想定していました。

からSystem.OverflowException:

次の条件下では、実行時に OverflowException がスローされます。

  • 算術演算は、演算によって返されるデータ型の範囲外の結果を生成します。
  • キャストまたは変換操作で縮小変換を実行しようとしましたが、ソース データ型の値がターゲット データ型の範囲外です。

lSmallValue - lBigValue操作が最初のカテゴリに分類されないのはなぜですか?

4

2 に答える 2

11

デフォルトでは、CLR はオーバーフロー例外をスローしません。「checked」キーワードを使用していない限り。

http://msdn.microsoft.com/en-us/library/74b4xzyw%28v=vs.71%29.aspx

UPD: 実際には、Jeffrey Richter による「C# 経由の CLR」をお勧めします。彼はこれらのことをより透明にしています。CLR と C# の基礎に関する私のお気に入りの本。

于 2012-09-24T19:26:07.373 に答える
0

「算術演算、キャスト、または変換操作で OverflowException をスローするには、操作がチェックされたコンテキストで発生する必要があります。」

チェックされたブロック内にコードを配置するとすぐに、OverflowException が呼び出されます。

ulong lSmallValue = 5;
ulong lBigValue = 10;
checked {
try {
    ulong lDifference = lSmallValue - lBigValue;
}
catch (OverflowException) {
    Console.WriteLine("Exception caught");
}}
于 2012-09-24T19:25:37.287 に答える