[C#] なぜ、.NET 2.0のプリミティブ(つまり:int)にnullをキャストすると、NULL参照例外がスローされ、無効なキャスト例外がスローされないのですか?


Answers

コンパイルした場合

object o = null;
int a = (int)o;

MSILコードを見ると、次のような表示になります

ldnull
...
unbox.any int32

unbox.anyの動作は次のようになります。

objがボックス型でない場合、InvalidCastExceptionがスローされます。

objがnull参照の場合、NullReferenceExceptionがスローされます。

これはあなたのコードで見られるものです。

Question

私はいくつかのコードを見て、私のコンボボックスがまだ初期化されていないシナリオに遭遇しました。 これは.NET 2.0および次のコードではthis.cbRegion.SelectedValueはnullです。

int id = (int)this.cbRegion.SelectedValue;

このコードは、無効なキャスト例外の代わりにnull参照例外を投げました。 なぜ誰かが無効なキャストの代わりにnull参照例外をスローするのを知っていたのでしょうか?




例外は、選択された値(null)です。 それはキャストに到達することさえありません。