3

私はいくつかのコードを調べていて、コンボボックスがまだ初期化されていないシナリオに出くわしました。これは.NET2.0にあり、次のコードでは、this.cbRegion.SelectedValueはnullです。

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

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

4

4 に答える 4

9

これは、ボクシングとアンボクシングに関係しています。ボックスから int を引き出しようとしています (unbox) が、オブジェクトが null であるため、キャストする変更を取得する前に null 参照例外が発生します。

于 2008-12-11T22:43:28.000 に答える
8

コンパイルすると

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

MSIL コードを見ると、次のようなものが表示されます。

ldnull
...
unbox.any int32

現在、unbox.any の動作は次のように指定されています。

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

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

これは、コードに表示されるものです。

于 2008-12-11T22:49:32.700 に答える
1

キャストする前にオブジェクトを読み取ろうとしています。したがって、キャスト例外ではなくnull例外が発生します。

于 2008-12-11T22:39:26.433 に答える
0

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

于 2008-12-11T22:40:49.050 に答える