では.NET
、すべての値の型がSystem.ValueTypeという名前のクラスから継承されます。System.ValueType
はクラスなので、reference type
です。
私の質問は、 a が avalue type
から派生する可能性とその理由reference type
です。
では.NET
、すべての値の型がSystem.ValueTypeという名前のクラスから継承されます。System.ValueType
はクラスなので、reference type
です。
私の質問は、 a が avalue type
から派生する可能性とその理由reference type
です。
以下は、ドキュメントの重要な段落です
ValueType は値型の暗黙的な基本クラスですが、ValueType から直接継承するクラスを作成することはできません。代わりに、個々のコンパイラが言語キーワードまたは構成要素 (C# の struct や Visual Basic の Structure…End Structure など) を提供して、値型の作成をサポートします。
継承は、コンパイラが のオーバーライドされた仮想メソッドをコンパイルするときに発生しますSystem.Object
。このSystem.ValueType
クラスはToString()
、などのより適切なオーバーロードを提供するだけです。ドキュメントに記載されているように、キーワードが (C# で) 使用されGetHashCode()
ている場合、コンパイラはこれらのオーバーロードを使用します。struct
これにより、コンパイラはSystem.ValueType
メソッドの代わりにメソッドを使用するようになりSystem.Object
ます。
System.Object
おそらくより簡単な例は、すべての値の型が参照型でもあるから派生することです。
int i = 3;
int j = 3;
object io = i;
object jo = j;
この時点で、io
とは、とjo
の値のコピーを参照する参照です。値は、キャストを使用して再度抽出できます。i
j
int i2 = (int)io;
int j2 = (int)jo;
機能的には、これは大まかに への変換が舞台裏でオブジェクトをobject
作成し、に設定されているかのように機能します。からthen へのキャストはを読み取ります。class ValueWrapper<T> { public T value; }
io
new ValueWrapper<int> { value = i }
io
int
((ValueWrapper<int>)io).value
これは正確に起こることではありませんが、起こることは十分に類似しているので、うまくいけば十分に明確になります。
Eric LippertはThe C# Programming Language 4th Editionで次のように述べています。
この点は、初心者を混乱させることがよくあります。「しかし、値型が参照型から派生する可能性はありますか?」という質問をよく受けます。「由来」の意味を誤解した結果、混乱が生じたと思います。派生は、基本型のメモリ内のビットのレイアウトが派生型のビットのレイアウトのどこかにあることを意味するものではありません。むしろ、基本型のメンバーに派生型からアクセスできる何らかのメカニズムが存在することを意味するだけです。