为什么扩展方法表现不同?

Vim*_* CK 6 c# extension-methods

派生类包含一个"计数"方法,它对类"派生"执行一些操作.另一方面,我有一个扩展方法,它也是"派生"类的目标.

Derived derived = new Derived();
derived.Count();
Run Code Online (Sandbox Code Playgroud)

通过调用上面的代码片段将在派生类中执行"Count"方法.为什么C#编译器在这种情况下不会警告并识别扩展方法.框架内部如何处理这个?

//Base class
public class Base
{
    public virtual string Count()
    {
        return string.Empty;
    }
}

//Derived class
public class Derived : Base
{
    public override string Count()
    {
        return base.Count();
    }
}

//Extension Methods for Derived class
public static class ExtensionMethods
{
    public static Derived Count(this Derived value)
    {
        return new Derived();
    }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 6

规范(第7.6.5.2节)明确指出实例方法优先于扩展方法:

如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理.

...

前面的规则意味着实例方法优先于扩展方法,内部命名空间声明中可用的扩展方法优先于外部命名空间声明中可用的扩展方法,并且直接在命名空间中声明的扩展方法优先于导入到该命名空间中的扩展方法.带有using namespace指令的命名空间.例如:

如果实例方法与传递的参数匹配,则甚至不考虑扩展方法.