なぜObjectクラスの一部の機能を呼び出して、プリミティブ型のインスタンスで、ボクシングが必要?
-
24-09-2019 - |
質問
私は次のコード行を実行する場合ことを発見した。
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object
、いいえボクシングが行われ、私はi.GetType()
の代わりにSystem.Object
(GetHashCode()
から別の導関数)を呼び出す場合、なぜボクシングすることなく、直接、プリミティブ型のインスタンスにGetType()
を呼び出すために、そのことができない、ボクシングは、GetType()
を呼び出すために必要とされますボクシング?
GetHashCode()
を呼び出すことがその可能ながら、 解決
ここで重要なのは、 あなたは、構造体(まれ)を記述する場合、あなたの のはずまさにこの理由のため これは実際、GetType()
が仮想ではなく、オーバーライドできないということです。構造体が効果的にsealed
あるので、方法は、任意のランタイムとコンパイラが静的呼び出しとオーバーライドされたをしているの構造体のメソッドを扱うことができます。のよりの構造体よりも、ようにします。無効にすることはできませんP>
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関数の混乱する