我在学习中找到了以下程序。我不理解为什么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
}
}
有任何帮助表示赞赏吗?
答案 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
为参数。