我々は、すべての型がObjectから派生知っています。これは参照型です。値型である - - 私の の質問は、なぜintで参照 型Objectから継承しますか?これは可能ですか?
System.Int32
すべての構造体は、C#でそうであるように、System.ValueType
に由来します。この継承チェーンは、他のstruct
型では継承からあなたを禁止しているのと同じメカニズムで、コンパイラによって許可されています。共通言語ランタイム(CLR)は、System.ValueType
から派生する型の特殊なセマンティクスを持っています。 System.ValueType
自体は値型ではなく、すべての構造体の基本クラスを形成する参照型です。この継承階層は存在しますが、オブジェクトがメモリ内でどのようにレイアウトされるかについては何も保証する必要はありません。
なぜ、オブジェクトとして をパラメータとしてintを関数に渡す必要がありますか?通常の参照あなたは基本型の期待オブジェクトを関数のパラメータとして 派生型のオブジェクトを渡す必要があり、 で追加の何もする必要はありません。なぜここのボックス?任意のstruct
が最終的object
から派生したものの、それが実際に実行時で異なる扱いをされているので
。すべての構造体はデータのまとまりとして扱われ、.NETのすべての参照型にはメソッドテーブルポインタまたはシンクブロックインデックスはありません。追加データが実際に完全修飾object
タイプになるために、それに追加する必要があるためobject
を受け入れるメソッドに渡される任意の値型は、ボックス化されなければならない理由です。あなたがインターフェイスを実装した結果としてあなたstruct
に追加されたメソッドを呼び出したときにそれらがobject
型として渡さしているときに値の型のみ箱入りされていない、彼らはまた、例えば、箱入りされています。その値の型は、呼び出す必要のあるメソッドへの実際のメソッドテーブルのポインタを取得するために、ボックス化する必要があります。
あなたは小さな例でそれを見ることができます(リリースモードでコンパイル)
void Main()
{
IFoo m = new M();
m.X();
}
public struct M : IFoo
{
public void X() { }
}
public interface IFoo
{
void X();
}
には、次のILが得られます:
IL_0000: ldloca.s 00
IL_0002: initobj UserQuery.M
IL_0008: ldloc.0
IL_0009: box UserQuery.M
IL_000E: callvirt UserQuery+IFoo.X
IL_0013: ret
'すべての型はオブジェクトから派生しました。 '__は常に真です。 –
[この他の質問](http://stackoverflow.com/questions/1682231/how-do-valuetypes-derive-from-object-referencetype-and-still-be- valuetypes)に対する受け入れられた回答は、はるかに関連しています –
[すべてがオブジェクトから派生しているわけではありません](http://i1.blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx) –