ram*_*tal 0 c# extension-methods
为什么我不能在扩展方法中使用动态参数,如下面的代码所示:
public static class Extension
{
public static void ExtMethod(this Program pg, object asdf) {
new Program();
}
}
public class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
d.test = "test";
new Program().ExtMethod(d.test);
Extension.ExtMethod(new Program(), d.test);
}
}
Run Code Online (Sandbox Code Playgroud)
new Program().ExtMethod(d.test); 抛出编译时错误.
但是Extension.ExtMethod(new Program(), d.test);没有造成任何错误.
这是设计的,也是规范的一部分.根据ECMA C#5标准,第12.7.6.3节:
在其中一种形式[...]的方法调用(第12.6.6.2节)中,如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理.如果
expr或任何args具有编译时类型动态,则扩展方法将不适用.
其根本原因是动态绑定旨在提供与编译时绑定相同的结果......但对于扩展方法,这意味着using在执行时保留所有指令.这是可能的,但我怀疑它在调用性能方面会非常昂贵,而且C#设计团队决定不采用这种方式.