1

では.NET、すべての値の型がSystem.ValueTypeという名前のクラスから継承されます。System.ValueTypeはクラスなので、reference typeです。

私の質問は、 a が avalue typeから派生する可能性とその理由reference typeです。

4

4 に答える 4

6

以下は、ドキュメントの重要な段落です

ValueType は値型の暗黙的な基本クラスですが、ValueType から直接継承するクラスを作成することはできません。代わりに、個々のコンパイラが言語キーワードまたは構成要素 (C# の struct や Visual Basic の Structure…End Structure など) を提供して、値型の作成をサポートします。

継承は、コンパイラが のオーバーライドされた仮想メソッドをコンパイルするときに発生しますSystem.Object。このSystem.ValueTypeクラスはToString()、などのより適切なオーバーロードを提供するだけです。ドキュメントに記載されているように、キーワードが (C# で) 使用されGetHashCode()ている場合、コンパイラはこれらのオーバーロードを使用します。structこれにより、コンパイラはSystem.ValueTypeメソッドの代わりにメソッドを使用するようになりSystem.Objectます。

于 2012-11-26T11:46:24.910 に答える
1

System.Objectおそらくより簡単な例は、すべての値の型が参照型でもあるから派生することです。

int i = 3;
int j = 3;
object io = i;
object jo = j;

この時点で、ioとは、とjoの値のコピーを参照する参照です。値は、キャストを使用して再度抽出できます。ij

int i2 = (int)io;
int j2 = (int)jo;

機能的には、これは大まかに への変換が舞台裏でオブジェクトをobject作成し、に設定されているかのように機能します。からthen へのキャストはを読み取ります。class ValueWrapper<T> { public T value; }ionew ValueWrapper<int> { value = i }ioint((ValueWrapper<int>)io).value

これは正確に起こることではありませんが、起こることは十分に類似しているので、うまくいけば十分に明確になります。

于 2012-11-26T11:57:08.527 に答える
0

Eric LippertThe C# Programming Language 4th Editionで次のように述べています。

この点は、初心者を混乱させることがよくあります。「しかし、値型が参照型から派生する可能性はありますか?」という質問をよく受けます。「由来」の意味を誤解した結果、混乱が生じたと思います。派生は、基本型のメモリ内のビットのレイアウトが派生型のビットのレイアウトのどこかにあることを意味するものではありません。むしろ、基本型のメンバーに派生型からアクセスできる何らかのメカニズムが存在することを意味するだけです。

于 2012-12-10T16:09:15.270 に答える