5.1不完整类型声明
新类型修饰符partial,用于在多个部分定义同一个类型。为了确保与现存程序的兼容性,这个修饰符和其他修饰符不同,它不是一个关键字,且它必须紧邻在关键字class、struct、interface之前。
不完整类型声明的每一部分都必须包含partial修饰符,且其他部分必须在同一个命名空间中声明。partial修饰符表明该类型声明的附加部分可以存在于其他某个地方,但这种附加部分不是必须的;也可以在单一类型声明中出现。
不完整类型的所有部分必须放在一起编译,才能在编译时被融合;它不允许对已经被编译的类型进行扩展。
嵌套类型可以通过使用partial修饰符而在多个地方声明。通常情况下,嵌套类型包含的类型,也可以使用partial声明。
但partial修饰符不能用在委托/枚举声明中。
5.1.1 特性
不完整类型的特性通过以不定的顺序组合各个部分的特性而确定。如果一个特性被放在不完整类型的多个部分,那么等价于在这类型上多次指定该特性;类型参数上的特性也是这样的风格组合。
5.1.2 修饰符
当不完整类型声明包含访问修饰符时(public、protected、internal、private),它必须和其他部分的访问性一致;如果不完整类型的各个部分都不包含,该类型将赋予适当的默认可访问性。
如果嵌套类型的一个/多个不完整部分声明包含new修饰符,且嵌套类型因此了一个继承成员,将不会有任何警告;如果类的一个/多个不完整声明包含abstract修饰符,那么这个类就是抽象的;如果类的一个/多个不完整声明包含sealed修饰符,那么这个类就是封闭的;当unsafe修饰符用于一个不完整类型声明时,只有特定的部分被认为时不安全上下文。
5.1.3 类型参数和约束
如果泛型类型在多个部分被声明,那么每个部分都必须说明类型参数,每个部分都必须有相同数量的类型参数,并且对于每个类型参数必须有相同的名字和顺序;
当不完整泛型声明包含类型参数约束时,该约束必须和其他部分包含的约束一致。详细的说就是:包含约束的每个部分必须具有相同集合类型参数的约束,并且对于每个类型参数,类、接口、构造函数约束的集合必须是相同大的;如果不完整泛型的任何部分都没有指定约束,就认为类型参数是不带约束的。
5.1.4 基类
当不完整类型声明包含基类时, 其他部分都必须包含;如果不完整类型都不包含基类时,那么基类就会是System.Object。
5.1.5 基接口
在多个部分中声明的类型的基接口集合,是各个部分中指定的基接口的集合。一个特定的基接口在每个部分只能命名一次,可以在多个部分命名同一个基接口,但对于任何给出的基接口成员只能有唯一的实现。
类C的基接口就是IA,IB和IC。
通常在接口声明的每一部分提供接口的实现,但这不是必须的,可以在一个部分声明,在另一个部分实现接口。
5.1.6 成员
声明在多个部分中的类型的成员只是在各个部分中声明的成员的联合。类型声明的所有部分的内容共享的声明空间,并且每个成员的作用域扩展到所有部分的内容。任何成员的所有可访问域总是包含封闭类型的所有部分;在一个部分中声明的private成员可以随意地在另一个部分访问。在一个类型的多个部分中声明相同的成员将导致编译时错误,除非该成员声明中带有partial。
尽管在一个类型中成员的次序对于C#代码并不是太重要,但在面对其他语言和环境时却可能很重要。在这种情况下,在多个部分中声明的类型内成员次序将是未定义的。
5.2名称绑定
虽然可扩展类型的每一部分必须在相同的命名空间声明,但还是有办法写在不同命名空间下,那就是对各个部分使用不同的using指令。当在一个部分中解释简单名称时,只有包含该部分的命名空间using指令被考虑。这将导致在不同部分的相同标识符表示不同的意义。