c# - 为什么 C# 编译器不使用动态参数检查调用站点方法的 "staticness"?

标签 c# c#-4.0 dynamic static

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

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

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

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

下面的不会编译

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

因此尽管是动态分派(dispatch),编译器确实会检查 MyMethod 是否存在。为什么不验证“静态”?

最佳答案

这里的过载解析是动态的。在此代码段中可见:

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");
    }
}

工作正常。现在将 1 分配给 d 并注意运行时故障。编译器无法在编译时合理模拟动态重载解析,因此不会尝试。

关于c# - 为什么 C# 编译器不使用动态参数检查调用站点方法的 "staticness"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105879/

相关文章:

C# 创建一个比较两个成员属性的 LambdaExpression(对于 EF Core HasQueryFilter)

c# - 如何将图片框绘制到列表框中

javascript - 动态服务器时间

android - 带有 ArrayAdapter 和 TextWatcher 的动态 AutocompleteTextView

windows - 在 Windows 7/8 中读取设备管理器的属性字段

php - 如何为动态创建的元素分配唯一 ID - Javascript

c# - 从代码后面带参数调用 javascript 函数

c# - 使报表查看器可滚动

javascript - 如何使用 Javascript 呈现页面详细信息

unicode - 是否可以将语言特定字符转换为 UTF8 中的拉丁字符