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

Extension Method not clear in the following program

我在学习中找到了以下程序。我不理解为什么 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
    }
}

有什么帮助吗?

I see no difference in all the four classes.

仔细看。 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 作为参数。