扩展方法可以覆盖实例方法吗?
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 是否应该检查它们的方法?他们根本没有建立支票,这是你应该自己做的事情。
是否可以通过扩展方法覆盖实例方法?例如,我有一个程序集(已编译,没有源代码),我想重写一些行为。
我创建了一些测试代码:
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 是否应该检查它们的方法?他们根本没有建立支票,这是你应该自己做的事情。