2017-08-22 11 views
16

私は2つのテストメソッドを持っています。最初の1つは正常に動作します。 2番目の例外は例外をスローしませんが、それはすべきです。なぜ、2番目の例外は例外をスローしませんか?C#インラインチェックステートメントが機能しません

[TestMethod] 
[ExpectedException(typeof(OverflowException))] 
public void LongToInt_OverflowWithCheckedBlock() 
{ 
    checked 
    { 
     int maxValue = 2147483647; 
     long longValue = (maxValue + 1); 
     int intValue = (int)longValue; 
    } 
} 

[TestMethod] 
[ExpectedException(typeof(OverflowException))] 
public void LongToInt_OverflowWithCheckedStatement() 
{ 

    int maxValue = 2147483647; 
    long longValue = (maxValue + 1); 
    int intValue = checked((int)longValue);  // No Exception is thrown, why? 
} 
+9

。 'longValue = maxValue + 1'は32ビット整数* first *で算術演算を行い、次に64ビットに変換します。このバグの最も一般的な形は 'double percent = someInteger/100;'です。質問は「なぜ私の割合は常にゼロですか?」です。あなたは* after *ではなく算術を行う前に算術演算を行う型に変換する必要があります。 –

答えて

25

最初のものはスロー理由及び第二の1になりますあなたの比較が少しずれているからではありません。第一の方法では

  • あなたはcheckintlongからあなただけcheckキャスト第二の方法では、すべて

、彼らは同じではないとどちらもスローされます以下のようにあなたがそれらを比較した場合:int intValue = checked((int) longValue);投げ1、その次の行ではありません。

private static void MethodA() 
{ 
    int maxValue = 2147483647; 
    long longValue = (maxValue + 1); 
    checked 
    { 
     int intValue = (int) longValue; 
    } 
} 

private static void MethodB() 
{ 
    int maxValue = 2147483647; 
    long longValue = (maxValue + 1); 
    int intValue = checked((int) longValue); 
} 

この行はこの理由があります:私はそこにチェックを入れた場合

long longValue = (maxValue + 1); 

彼らがスローされます両方:

ここはスロー理由:(maxValue + 1)longに割り当てること後に呼び出さintmaxValue(例外はここで発生した)とに1を加算しているため

それは、スローにあなたcastint場合long追加1を実行する前に、それがスローされません。

long longValue = ((long) maxValue + 1); 
2

これは、longに変換されているためです。チェックされていない(maxValue + 1)の結果はlongに保存されている-2147483648の結果になり、またintに戻ってキャストされます。したがって、最終鋳造した後、あなたのintValue-2147483648

は、代わりに以下のように試してみて、それがOverflowException

int intValue = checked(maxValue + 1); 

(または)さえ

long longValue = checked((maxValue + 1)); 
8

MSDN documentようを、前記

キーワードを明示的 一体型演算や変換をチェックオーバーフローを可能にするために使用されているチェック。

宣言ブロック内オーバーフロー値がある場合は、最初の試験方法は、既に確認されています。

enter image description here

第二の試験方法は、オーバーフロー値だけのコード行をチェックしています。

int intValue = checked((int)longValue); //Checked expression

enter image description here

オーバーフローがchecked発現前に発生しているので、CLRは、既に値を変換。 int型の範囲が enter image description here

違いは何ですか?ですので、 そして、それの値は-2147483648which is legalですか

試験方法1:チェックブロック

試験方法2:あなたは*後半変換*バグを持っているチェック表現

関連する問題