13

要点を言えば:

int? i = null;
i.ToString(); //happy
i.GetType(); //not happy

なぜうまく機能するのかを実際に扱っている非常に関連する質問i.ToString()があります。

編集:このコーナー ケースが、この SO スレッドで最も投票されたケースであることがわかりました!

4

3 に答える 3

7

ToString仮想ではないのに仮想だからですGetType。Nullable には、CLR での特別なボクシング動作があります。GetTypenullableを呼び出すと、ボックス化されます ( MSDNを参照してください。実際には、これは any で発生しますstruct)。ただし、nullable では、実際の nullable ではなく、基になる値がボックス化されます。ToString一方、 の ToString メソッドのオーバーライドを呼び出しますNullable<T>int? i = nullまた、の構文シュガーであることに注意してくださいNullable<int> i = new Nullable<int>()。したがって、変数には実際にオブジェクトがありますi

于 2012-10-14T20:59:43.200 に答える
3

なぜi.ToString()失敗しないのですか?

任意の.NET逆コンパイラーを使用して、Nullable<T>クラスを確認します。ToString()次のようにオーバーライドされていることがわかります。

public override string ToString()
{
  if (!this.HasValue)
    return "";
  else
    return this.value.ToString();
}

なぜi.GetType()失敗するのですか?

マイクzの答えを参照してください。

于 2012-10-14T21:02:57.403 に答える
0

タイプint?はレギュラータイプではありません。

を記述するとint? i = null、オブジェクトの値のみが null であり、オブジェクト自体ではありません。

からのオブジェクトのint?継承によりobject、関数i.ToString()が機能し、オブジェクト内ので機能します。

于 2012-10-14T20:59:27.180 に答える