6

派生类包含一个“计数”方法,该方法对“派生”类执行一些操作。另一方面,我有一个扩展方法,它也针对“派生”类。

Derived derived = new Derived();
derived.Count();

通过调用上面的代码片段将在派生类中执行“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();
    }
}
4

1 回答 1

6

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

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

...

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

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

于 2013-08-11T19:18:42.630 回答