重载解析
命名参数和可选参数影响了重载解析,但产生的变化相当简单——
如果所有的参数或者是可选的,或者在调用时(通过名字或位置)明确提供了对应的实参,并且实参能够转换为形参类型,则该签名是可适用的(applicable)。
转换的最优原则只用于明确给定的实参——出于最优的目的,忽略掉的可选参数在重载解析时将不做考虑。
如果两个签名一样好,则没有忽略可选参数的那个胜出。
M(object o);
M(int i, string s = “Hello”);
M(int i);
M(5);
M(int,string)和M(int)都比M(object)要好,因为将5转换为int优于将5转换为object。
最后,M(int)优于M(int,string),因为它没有被忽略的可选参数。
因此,最终调用的方法是M(int)。
COM互操作特性
动态查找以及命名参数和可选参数极大地改善了与COM API——如Office Automation API——互操作的体验。为了减少更多的速度损失,C# 4.0还添加了大量特定于COM的小特性。
动态导入
很多COM方法接受并返回可变类型,这在PIA中会表现为object。在绝大多数情况下,程序员在调用这些方法之前就已经从上下文中知道了一个返回值对象的静态类型,但为了使用这些知识,必须明确地在返回值上进行类型转换。这些转换非常普遍,带来了巨大的麻烦。
为了得到无缝体验,现在你可以选择使用dynamic类型来代替可变类型的方式。换句话说,从你的角度来看,COM签名中出现的是dynamic而不是object。
这意味着你可以直接在返回的对象上访问成员,或者可以使用强类型的局部变量为其赋值,而无需进行转换。例如,你可以写
而不用写
而不用写
无PIA的编译
主互操作程序集(Primary Interop Assembly)是从COM接口生成的大型.NET程序集,用于协助完成强类型的互操作。它们为设计时提供了巨大的支持,就好像其中的类型真的是用.NET定义的一样。然而,在运行时这些大型程序集很容易使你的程序膨胀起来,而且很容易导致版本问题,因为它们是分布式的,不依赖你的应用程序。
无PIA特性允许你继续在设计时使用PIA,而无需在运行时使用它们。C#编译器会将程序中实际用到的PIA中的一小部分直接编译到程序集中。在运行时无需加载PIA。