Dieser Absatz ist kurz, deshalb werde ich ihn zuerst entfernen:)
23 unvollständige Typen
23.1 Unvollständige Typdeklaration
Der neue Typmodifikator partiell ist Wird in mehreren Fällen verwendet. Definieren Sie einen Typ im Abschnitt. Um die Kompatibilität mit vorhandenen Programmen sicherzustellen, unterscheidet sich dieser Modifikator von anderen Modifikatoren (z. B. get und set) dadurch, dass er kein Schlüsselwort ist und unmittelbar vor dem Schlüsselwort class, struct oder interface stehen muss.
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 标识符 类型参数列表 可选 基接口 可选 类型参数约束语句 可选 接口体 ;可选)
Jeder Teil einer unvollständigen Typdeklaration muss den Teilmodifikator enthalten und im selben Namensraum wie die anderen Teile deklariert werden. Der partielle Modifikator gibt an, dass zusätzliche Teile der Typdeklaration an anderer Stelle vorhanden sein können, die Existenz solcher zusätzlicher Teile ist jedoch auch sinnvoll, den partiellen Modifikator in eine einzelne Typdeklaration aufzunehmen.
Alle Teile eines unvollständigen Typs müssen zusammen kompiliert werden, damit sie zur Kompilierungszeit zusammengeführt werden können. Insbesondere unvollständige Typen erlauben keine Erweiterungen auf bereits kompilierte Typen.
Verschachtelte Typen können mithilfe des Teilmodifikators an mehreren Stellen deklariert werden. Typischerweise wird auch der enthaltende Typ (d. h. der Typ, der den verschachtelten Typ enthält) partiell deklariert, und die Teile des verschachtelten Typs werden in verschiedenen Teilen des enthaltenden Typs deklariert.
Der Teilmodifikator kann nicht in einer Delegaten- oder Aufzählungsdeklaration verwendet werden.
23.1 Eigenschaften
Die Eigenschaften eines unvollständigen Typs werden durch Kombination der Eigenschaften der einzelnen Teile in einer nicht festgelegten Reihenfolge bestimmt. Wenn ein Attribut in mehr als einem Teil eines unvollständigen Typs platziert wird, ist dies gleichbedeutend mit der mehrfachen Angabe des Attributs für diesen Typ. Beispielsweise werden auch die beiden Teile
[Attr1, Attr2("hello")] partial class A {} [Attr3, Attr2("goodbye")] partial class A {} 等价于如下声明。 [Attr1, Attr2("hello"), Attr3, Attr2("goodbye")] class A {}
-Attribute für Typparameter im gleichen Stil kombiniert.
23.1.2 Modifikatoren
Wenn eine unvollständige Typdeklaration Zugriffsspezifikationen enthält (öffentlich, geschützt, intern und privat), muss sie mit den Zugriffsspezifikationen anderer Teile konsistent sein. Wenn keine Teile eines unvollständigen Typs Zugriffsspezifikationen enthalten, erhält der Typ die entsprechende Standardzugänglichkeit (§3.5.1).
Wenn eine oder mehrere unvollständige Deklarationen eines verschachtelten Typs den neuen Modifikator enthalten, wird keine Warnung ausgegeben, wenn der verschachtelte Typ ein geerbtes Mitglied verbirgt. (§3.7.12)
Wenn eine oder mehrere unvollständige Deklarationen einer Klasse den abstrakten Modifikator enthalten, dann ist die Klasse abstrakt (§10.1.1.1), andernfalls ist sie nicht abstrakt von.
Beachten Sie, dass eine Klasse nicht gleichzeitig abstrakt und versiegelt sein kann.
Wenn der unsichere Modifikator für eine unvollständige Typdeklaration verwendet wird, gilt nur der angegebene Teil als unsicherer Kontext [unsicherer Kontext (§18.1))].
23.1.3 Typparameter und Einschränkungen
Wenn ein generischer Typ in mehreren Teilen deklariert wird, muss jeder Teil die Typparameter angeben. Jeder Teil muss die gleiche Anzahl an Typparametern haben und jeder Typparameter muss den gleichen Namen und die gleiche Reihenfolge haben.
Wenn eine unvollständige generische Deklaration eine Typparametereinschränkung (Where-Anweisung) enthält, muss die Einschränkung mit den Einschränkungen in anderen Teilen konsistent sein. Insbesondere muss jeder Teil, der eine Einschränkung enthält, denselben Satz von Typparametern für die Einschränkung haben, und der Satz von
Klassen-, Schnittstellen- und Konstruktoreinschränkungen muss für jeden Typparameter gleich sein. Wenn für keinen Teil eines unvollständigen Generikums Einschränkungen angegeben sind, gelten die Typparameter als nicht eingeschränkt.
Beispiel
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> { ... }
ist korrekt, da diese Abschnitte, die Einschränkungen enthalten, effektiv denselben Satz von Klassen, Schnittstellen und Konstruktoreinschränkungen für den entsprechenden gleichen Satz von Typparametern angeben.
23.1.4 Basisklassen
Wenn eine unvollständige Klassendeklaration eine Basisklassenspezifikation enthält, muss sie mit allen anderen Teilen, die die Basisklassenspezifikation enthalten, konsistent sein. Wenn ein Teil der unvollständigen Klassendeklaration keine Basisklassendeklaration enthält, ist die Basisklasse System.Object (§10.1.2.1).
23.1.5 Basisschnittstellen
Eine Sammlung von Basisschnittstellen für einen in mehreren Teilen deklarierten Typ ist eine Vereinigung der in jedem Teil angegebenen Basisschnittstellen. Eine bestimmte Basisschnittstelle kann in jedem Abschnitt nur einmal benannt werden, dieselbe Basisschnittstelle kann jedoch in mehreren Abschnitten benannt werden. Für jedes Basisschnittstellenmitglied kann es jedoch nur eine Implementierung geben.
Im Beispiel
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中文网(www.php.cn)!