C#:为什么我不能在扩展方法中使用动态参数?

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);没有造成任何错误.

Jon*_*eet 5

这是设计的,也是规范的一部分.根据ECMA C#5标准,第12.7.6.3节:

在其中一种形式[...]的方法调用(第12.6.6.2节)中,如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理.如果expr或任何args具有编译时类型动态,则扩展方法将不适用.

其根本原因是动态绑定旨在提供与编译时绑定相同的结果......但对于扩展方法,这意味着using在执行时保留所有指令.这是可能的,但我怀疑它在调用性能方面会非常昂贵,而且C#设计团队决定不采用这种方式.