扩展方法在以下程序中不明确

时间:2016-04-07 15:24:46

标签: c#-3.0

我在学习中找到了以下程序。我不理解为什么Class3和class4方法调用与class1和class2不同的输出。我认为这四个班级没有区别。为什么class1和class2会自动调用扩展方法?

using System;

class Class1 {
}

class Class2 {
    public void Method1(string s) {
        Console.WriteLine("Class2.Method1");
    }
}

class Class3 {
    public void Method1(object o) {
        Console.WriteLine("Class3.Method1");
    }
}

class Class4 {
    public void Method1(int i) {
        Console.WriteLine("Class4.Method1");
    }
}

static class Extensions {
    static public void Method1(this object o, int i) {
        Console.WriteLine("Extensions.Method1");
    }

    static void Main() {
        new Class1().Method1(12); // Extensions.Method1 is called
        new Class2().Method1(12); // Extensions.Method1 is called
        new Class3().Method1(12); // Class3.Method1 is called
        new Class4().Method1(12); // Class4.Method1 is called
    }
}

有任何帮助表示赞赏吗?

1 个答案:

答案 0 :(得分:1)

  

我认为这四个班级没有区别。

仔细观察。 Class1根本没有本地方法。并且其他三个类中的方法签名都是不同的。方法签名是编译器确定要调用哪个方法的关键。

new Class1().Method1(12); // Extensions.Method1 is called

Class1没有原生Method1,因此唯一可以调用的是扩展方法。

new Class2().Method1(12); // Extensions.Method1 is called

Class2 具有原生Method1该方法需要string作为参数。正在提供int,这是扩展方法所期望的。如果没有扩展方法且Class2有两个重载,一个包含string,另一个包含int,则此解析方法与扩展方法相同。

new Class3().Method1(12); // Class3.Method1 is called

Class3有一个需要对象的本机方法。由于提供的整数满足,因此它优先于扩展方法。

new Class4().Method1(12); // Class4.Method1 is called

与上面的Class3相同,这个调用满足了一个本机方法。这个更具体,以int为参数。