扩展方法与父类方法行为

bni*_*dyc 2 c# extension-methods

看下面的代码:

class A
{
    public string DoSomething(string str)
    {
        return "A.DoSomething: " + str;
    }
}

class B : A
{
}

static class BExtensions
{
    public static string DoSomething(this B b, string str)
    {
        return "BExtensions.DoSomething: " + str;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var a = new A();
        var b = new B();
        Console.WriteLine(a.DoSomething("test"));
        Console.WriteLine(b.DoSomething("test"));

        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

代码的输出是:

A.DoSomething:测试

A.DoSomething:测试

编译时,它不会发出警告.

我的问题是:为什么在代码编译时没有警告,以及在DoSomething调用方法时究竟发生了什么?

Ant*_*lev 6

调用该方法时会发生什么很简单:只是实例方法调用.由于C#是早期绑定的,因此所有方法都在编译时解析.此外,实例方法比扩展方法更受欢迎,因此这就是永远不会调用扩展方法的原因.

看到这个:

您可以使用扩展方法来扩展类或接口,但不能覆盖它们.永远不会调用与接口或类方法具有相同名称和签名的扩展方法.在编译时,扩展方法的优先级始终低于类型本身中定义的实例方法.

换句话说,如果类型具有名为的方法Process(int i),并且您具有具有相同签名的扩展方法,则编译器将始终绑定到实例方法.当编译器遇到方法调用时,它首先在类型的实例方法中查找匹配项.如果未找到匹配项,它将搜索为该类型定义的任何扩展方法,并绑定到它找到的第一个扩展方法.