要点を言えば:
int? i = null;
i.ToString(); //happy
i.GetType(); //not happy
なぜうまく機能するのかを実際に扱っている非常に関連する質問i.ToString()があります。
編集:このコーナー ケースが、この SO スレッドで最も投票されたケースであることがわかりました!
ToString仮想ではないのに仮想だからですGetType。Nullable には、CLR での特別なボクシング動作があります。GetTypenullableを呼び出すと、ボックス化されます ( MSDNを参照してください。実際には、これは any で発生しますstruct)。ただし、nullable では、実際の nullable ではなく、基になる値がボックス化されます。ToString一方、 の ToString メソッドのオーバーライドを呼び出しますNullable<T>。int? i = nullまた、の構文シュガーであることに注意してくださいNullable<int> i = new Nullable<int>()。したがって、変数には実際にオブジェクトがありますi。
なぜ
i.ToString()失敗しないのですか?
任意の.NET逆コンパイラーを使用して、Nullable<T>クラスを確認します。ToString()次のようにオーバーライドされていることがわかります。
public override string ToString()
{
if (!this.HasValue)
return "";
else
return this.value.ToString();
}
なぜ
i.GetType()失敗するのですか?
マイクzの答えを参照してください。
タイプint?はレギュラータイプではありません。
を記述するとint? i = null、オブジェクトの値のみが null であり、オブジェクト自体ではありません。
からのオブジェクトのint?継承によりobject、関数i.ToString()が機能し、オブジェクト内の値で機能します。