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

时间:2015-02-26 12:24:58

标签: c# .net extension-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将此方法标记为实例(扩展方法有另一个图标)

enter image description here

输出说

  

实例方法称为

没有关于扩展方法的说明。所以,没办法覆盖实例方法,对吗?

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

1 个答案:

答案 0 :(得分:3)

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

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

如果您想强制调用扩展方法,请将其称为常规static方法:

ExtMethods.MyMethod(yourClassInstance);

关于为什么VS没有告诉你这是重复的原因:实际上它无法做到这一点。如果您在object上有扩展方法,该怎么办?如果任何方法是重复的,VS应该检查所有类及其方法吗?他们根本就没有制作支票,你应该自己做。