.NETの値型は、。と呼ばれる特別なクラスから派生したクラスですが、定義されているという点で奇妙ValueType
です。すべての値型には、から派生したクラスオブジェクトのように動作するヒープオブジェクト型がありますValueType
が、値型の格納場所には、プリミティブ値を表すバイトのコレクション、またはすべてを保持するために必要なバイトの連結が保持されます。そのパブリックフィールドとプライベートフィールド。
値型の格納場所は、値を表すために必要なバイトを保持するだけであり、型情報も型情報を保持するオブジェクトへの参照も保持しないため、値型の格納場所を使用するコードは、それが何であるかを正確に知る必要があります。
従来の継承では、オブジェクトが自身の型に関する情報を保持する必要がありますが、値型がそれを行うためのプロビジョニングはありません。
BaseStructure
.NETでは、変数がaのみを保持でき、。BaseStructure
を保持できないなど、いくつかの特別なルールを使用して、限定された形式の値型継承を許可することが概念的に可能(かつ有用)ですDerivedStructure
。を定義することができStructureUser<T> where T:BaseStructure
、そのようなクラスまたはメソッドはBaseStructure
、基本型に共通のメンバー(フィールドを含む)の派生物を受け入れて使用することができます。
残念ながら、許可されたシナリオで一貫して動作し、既存のコードを壊さないような方法でジェネリックスのルールを定義することは困難です。
たとえば、クラス内では、が値型であっても、型の変数にFoo<T,U> where T:U
を格納することが常に可能です(つまり、値型は封印されており、同じ型であることが保証されているため)。継承可能な値型であり、派生物である可能性がある場合、そのような保証は成立しません。T
U
U
T
U
U
T
このような継承に関連する問題を考えると、より有用な代替手段は、プロパティがbyrefまたはconst-byrefを公開できる安全な(制限されている場合でも)手段を提供することです(byrefは、パラメーターが使用するときに渡されるものです)ref
修飾子)。
このような機能は、フィールドとプロパティの間の避けられない意味上の違いを取り除き、実装方法によっては、クラスで使用した場合でもいくつかの大きな利点を提供できます(たとえば、不変型と可変型の効率的な混合が可能になります)。