为什么c#编译器在带有动态参数的调用站点检查方法的"静态"?

Run*_*une 22 c# static dynamic c#-4.0

为什么C#编译器不告诉我这段代码无效?

class Program
{
    static void Main(string[] args)
    {
        dynamic d = 1;
        MyMethod(d);
    }

    public void MyMethod(int i) 
    {
        Console.WriteLine("int");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用MyMethod在运行时失败,因为我试图从静态方法调用非静态方法.这是非常合理的,但为什么编译器在编译时不认为这是一个错误?

以下内容无法编译

class Program
{
    static void Main(string[] args)
    {
        dynamic d = 1;
        MyMethod(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以尽管动态调度,编译器会检查是否MyMethod存在.为什么不验证"静态"?

Han*_*ant 14

这里的过载分辨率是动态的.在此代码段中可见:

class Program {
    public static void Main() {
        dynamic d = 1.0;
        MyMethod(d);
    }

    public void MyMethod(int i) {
        Console.WriteLine("int");
    }

    public static void MyMethod(double d) {
        Console.WriteLine("double");
    }
}
Run Code Online (Sandbox Code Playgroud)

工作良好.现在将1分配给d并记下运行时故障.编译器无法在编译时合理地模拟动态重载决策,因此它不会尝试.

  • 但是如果没有名称为"MyMethod"的实例方法,它*应该*能够生成编译错误???? 显然,编译器很聪明,可以看看MyMethod是否"根本不存在......所以你的答案还不能说服我......也许你可以详细说明一下?:-) (2认同)