なぜObjectクラスの一部の機能を呼び出して、プリミティブ型のインスタンスで、ボクシングが必要?

StackOverflow https://stackoverflow.com/questions/2179366

  •  24-09-2019
  •  | 
  •  

質問

私は次のコード行を実行する場合ことを発見した。

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

いいえボクシングが行われ、私はi.GetType()の代わりにSystem.ObjectGetHashCode()から別の導関数)を呼び出す場合、なぜボクシングすることなく、直接、プリミティブ型のインスタンスにGetType()を呼び出すために、そのことができない、ボクシングは、GetType()を呼び出すために必要とされますボクシング?

なしGetHashCode()を呼び出すことがその可能ながら、
役に立ちましたか?

解決

ここで重要なのは、GetType()が仮想ではなく、オーバーライドできないということです。構造体が効果的にsealedあるので、方法は、任意のランタイムとコンパイラが静的呼び出しとオーバーライドされたをしているの構造体のメソッドを扱うことができます。のよりの構造体よりも、ようにします。

あなたは、構造体(まれ)を記述する場合、あなたの のはずまさにこの理由のためToString()Equals()GetHashCode()のようなすべてのメソッドをオーバーライドします。そうしない場合、それは箱なければなりません。しかし、GetType() のできない上書きすることは、このようにボクシングを必要とします。

これは実際、Nullable<T>に空Nullable<T>ボックスので、nullとボクシングでいくつかの奇妙なエッジケースにつながるので

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

他のヒント

私は理由がGetHashCodeメソッドが直接可能System.Int32に実装されていることだと思う、あなたは可能System.Int32 :: GetHashCodeメソッド()を呼び出します。ボックスに必要ありませんあなたが値型の既知のメンバ関数を呼び出す場合。

非常に近いどのように見えますValueType.GetType()は構造体

のタイプを決定することができます

また関連しているメソッドGetTypeとTypeOf関数の混乱する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top