私はいくつかのコードを調べていて、コンボボックスがまだ初期化されていないシナリオに出くわしました。これは.NET2.0にあり、次のコードでは、this.cbRegion.SelectedValueはnullです。
int id = (int)this.cbRegion.SelectedValue;
このコードは、無効なキャスト例外ではなく、null参照例外をスローしました。無効なキャストの代わりにnull参照例外をスローする理由を誰かが知っているのだろうか?
これは、ボクシングとアンボクシングに関係しています。ボックスから int を引き出しようとしています (unbox) が、オブジェクトが null であるため、キャストする変更を取得する前に null 参照例外が発生します。
コンパイルすると
object o = null;
int a = (int)o;
MSIL コードを見ると、次のようなものが表示されます。
ldnull
...
unbox.any int32
現在、unbox.any の動作は次のように指定されています。
obj がボックス型でない場合、InvalidCastException がスローされます。
obj が null 参照の場合、NullReferenceException がスローされます。
これは、コードに表示されるものです。
キャストする前にオブジェクトを読み取ろうとしています。したがって、キャスト例外ではなくnull例外が発生します。
例外は、null である選択された値にあります。キャストに到達することさえありません。