このセクションは短いので、最初に削除します:)
23 不完全な型
23.1 不完全な型宣言
新しい型修飾子の部分的は、複数の部分で型を定義するために使用されます。既存のプログラムとの互換性を確保するために、この修飾子はキーワードではないという点で他の修飾子 (get や set など) とは異なり、キーワードのクラス、構造体、またはインターフェイスの直前に指定する必要があります。
l class-declaration(类声明) attributes opt class-modifiers opt partialopt class identifier type-parameter-list opt class-base opt type-parameter-constraints-clausesopt class-body ;opt (特性 可选 类修饰符 可选 partial可选 class 标识符 类型参数列表 可选 :基类 可选 类型参数约束语句 可选 类体;可选) l struct-declaration:(结构声明) attributesopt struct-modifiersopt partialopt struct identifier type-parameter-listopt struct-interfacesopt type-parameter-constraints-clausesopt struct-body ;opt (特性 可选 结构修饰符 可选 partial 可选 struct 标识符 类型参数列表 可选 结构接口 可选 类型参数约束语句 可选 结构体;可选 ) l interface-declaration:(接口声明) attributesopt interface-modifiersopt partialopt interface identifier type-parameter-listopt interface-baseopt type-parameter-constraints-clausesopt interface-body ;opt (特性可选 接口修饰符 可选 partial 可选 interface 标识符 类型参数列表 可选 基接口 可选 类型参数约束语句 可选 接口体 ;可选)
不完全な型宣言の各部分には部分修飾子が含まれている必要があり、他の部分と同じ名前空間で宣言されている必要があります。部分修飾子は、型宣言の追加部分が別の場所に存在できることを示しますが、そのような追加部分の存在は必須ではありません。単一の型宣言に部分修飾子を含めることも合理的です。
不完全な型のすべての部分は、コンパイル時に融合できるように一緒にコンパイルする必要があります。特に、不完全な型では、既にコンパイルされた型への拡張は許可されません。
部分修飾子を使用すると、ネストされた型を複数の場所で宣言できます。通常、包含型 (つまり、ネストされた型を含む型) も、partial を使用して宣言され、ネストされた型の部分は、包含型の別の部分で宣言されます。
部分修飾子はデリゲート宣言または列挙宣言では使用できません。
23.1 プロパティ
不完全型のプロパティは、その部分のプロパティを不特定の順序で組み合わせることによって決定されます。属性が不完全な型の複数の部分に配置されている場合、それはその型に対して属性を複数回指定することと同じです。たとえば、2 つの部分
[Attr1, Attr2("hello")] partial class A {} [Attr3, Attr2("goodbye")] partial class A {} 等价于如下声明。 [Attr1, Attr2("hello"), Attr3, Attr2("goodbye")] class A {}
の型パラメータの属性も同じスタイルで結合されます。
23.1.2 修飾子
不完全な型宣言にアクセス仕様 (public、protected、internal、private) が含まれる場合、他の部分のアクセス仕様と一貫性がなければなりません。不完全な型のどの部分にもアクセス仕様が含まれていない場合、その型には適切なデフォルトのアクセシビリティが与えられます (§3.5.1)。
ネストされた型の 1 つ以上の不完全な宣言に new 修飾子が含まれている場合、ネストされた型が継承されたメンバーを非表示にしても、警告は表示されません。 (§3.7.12)
クラスの 1 つ以上の不完全な宣言に abstract 修飾子が含まれている場合、そのクラスは抽象 (§10.1.1.1) であり、それ以外の場合は非抽象です。
クラスを同時に抽象化とシール化することはできないことに注意してください。
unsafe 修飾子が不完全な型宣言で使用される場合、特定の部分のみが安全でないコンテキストとみなされます [安全でないコンテキスト (§18.1))]。
23.1.3 型パラメーターと制約
ジェネリック型が複数の部分で宣言されている場合、各部分で型パラメーターを指定する必要があります。各部分には同じ数の型パラメータが必要で、各型パラメータの名前と順序も同じである必要があります。
不完全なジェネリック宣言に型パラメーター制約 (where ステートメント) が含まれる場合、その制約は他の部分の制約と一貫性がなければなりません。特に、制約を含む各部分には、制約に対する同じ型パラメーターのセットが必要であり、
クラス、インターフェイス、およびコンストラクター制約のセットは各型パラメーターで同じである必要があります。不完全なジェネリックのどの部分にも制約が指定されていない場合、型パラメーターは制約がないと見なされます。
例
partial class Dictionary<K,V> where K: IComparable<K> where V: IKeyProvider<K>, IPersistable { ... } partial class Dictionary<K,V> where V: IPersistable, IKeyProvider<K> where K: IComparable<K> { ... } partial class Dictionary<K,V> { ... }
は、制約を含むこれらのセクションが、対応する同じ型パラメーターのセットに対して同じクラス、インターフェイス、およびコンストラクター制約のセットを事実上指定しているため、正しいです。
23.1.4 基本クラス
不完全なクラス宣言に基本クラス宣言が含まれる場合、基本クラス仕様を含む他のすべての部分と一貫性がなければなりません。不完全なクラス宣言の一部に基本クラス宣言が含まれていない場合、基本クラスは System.Object (§10.1.2.1) になります。
23.1.5 基本インターフェース
複数の部分で宣言された型の基本インターフェースのコレクションは、各部分で指定された基本インターフェースの結合です。特定のベース インターフェイスに名前を付けることができるのは各セクションで 1 回だけですが、同じベース インターフェイスに複数のセクションで名前を付けることができます。ただし、特定の基本インターフェイス メンバーに対して実装できる実装は 1 つだけです。
例で
partial class C: IA, IB {...} partial class C: IC {...} partial class C: IA, IB {...} 中类C的基接口是IA,IB和IC。
通常,在接口声明的部分中提供接口的实现;但这不是必需的。一个部分可以为声明在另一个部分中的接口提供实现。
partial class X { int IComparable.CompareTo(object o) {...} } partial class X: IComparable { ... }
23.1.6成员
声明在多个部分中的类型的成员只是在各个部分中声明的成员的联合。类型声明的所有部分的内容共享相同的声明空间(§3.3),并且每个成员(§3.7)的作用域扩展到所有部分的内容。任何成员的所有可访问域总是包含封闭类型的所有部分;在一个部分中声明的private成员可以随意的在另一个部分访问。在一个类型的多个部分中声明相同的成员将造成编译时错误,除非该成员是一个带有partial修饰符的成员。
partial class A { int x; // 错误, 不能多次声明x partial class Inner // Ok, Inner 是不完整类型 { int y; } } partial class A { int x; // 错误,不能多次声明x partial class Inner // Ok, Inner是不完整类型 { int z; } }
尽管一个类型中成员的次序对于C#代码并不是太重要,但在面对其他语言和环境时却可能是很重要的。在这样的情况下,在多个部分中声明的类型内成员次序将是未定义的。
23.2名字绑定
虽然可扩展类型的每个部分必须声明在相同的命名空间,但这些部分也可以写在不同的命名空间中。为此,对于各个部分可以使用不同的using指令(§9.3)。当在一个部分中解释简单名字(§7.5.2)时,只有包含该部分的命名空间using 指令被考虑。这将使得在不同部分的相同标识符表示不同的意义。
namespace N { using List = System.Collections.ArrayList; partial class A { List x; // x具有类型 System.Collections.ArrayList } } namespace N { using List = Widgets.LinkedList; partial class A { List y; // y 具有类型 Widgets.LinkedList } }
以上就是C# 2.0 Specification (四)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!