要点を言えば:
int? i = null;
i.ToString(); //happy
i.GetType(); //not happy
なぜうまく機能するのかを実際に扱っている非常に関連する質問i.ToString()
があります。
編集:このコーナー ケースが、この SO スレッドで最も投票されたケースであることがわかりました!
ToString
仮想ではないのに仮想だからですGetType
。Nullable には、CLR での特別なボクシング動作があります。GetType
nullableを呼び出すと、ボックス化されます ( 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()
が機能し、オブジェクト内の値で機能します。