扩展方法可以覆盖实例方法吗?

Can Extension-Methods overwrite instance methods?

是否可以通过扩展方法覆盖实例方法?例如,我有一个程序集(已编译,没有源代码),我想重写一些行为。

我创建了一些测试代码:

public class SomeClass
{
    public void MyMethod()
    {
        Console.WriteLine("Instance method is called");
    }
}

public static class ExtMethods
{
    public static void MyMethod(this SomeClass c)
    {
        Console.WriteLine("Extention method is called");
    }
}

然后我尝试使用:

SomeClass s = new SomeClass();
s.MyMethod();

编译成功,IntelliSence将此方法标记为实例(扩展方法有另一个图标)

输出显示

Instance method is called

none 存在关于扩展方法的注释。所以,没有办法覆盖实例方法,对吧?

为什么编译器和 VS 的行为如此缺乏信息? 如果我开发了一个扩展方法并且已经存在相同的实例方法(而且我不了解它),我可以花几个小时来理解为什么行为与预期不同...

不,您不能用扩展方法覆盖实例方法。因此,名称为'extension'的方法,只能扩展实例方法。

实例方法将始终覆盖扩展方法。

如果要强制调用扩展方法,请将其作为常规static方法调用:

ExtMethods.MyMethod(yourClassInstance);

关于为什么 VS 不告诉你它是重复的:实际上它不能那样做。如果您在 object 上有扩展方法怎么办?如果 all 类 方法重复,VS 是否应该检查它们的方法?他们根本没有建立支票,这是你应该自己做的事情。