是否可以通过扩展方法覆盖实例方法?例如,我有一个程序集(已编译,没有源代码),我想重写一些行为。
我为测试创建了一些代码:
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将此方法标记为实例(扩展方法有另一个图标)
输出说
实例方法称为
没有关于扩展方法的说明。所以,没办法覆盖实例方法,对吗?
为什么编译器和VS的行为是如此无信息?如果我开发了一个扩展方法并且已经存在相同的实例方法(我不知道它),我可以花上几个小时来理解为什么行为与预期不同......
答案 0 :(得分:3)
不,您不能使用扩展方法覆盖实例方法。因此,名称'扩展名'方法,你只能扩展实例方法。
实例方法将始终覆盖扩展方法。
如果您想强制调用扩展方法,请将其称为常规static
方法:
ExtMethods.MyMethod(yourClassInstance);
关于为什么VS没有告诉你这是重复的原因:实际上它无法做到这一点。如果您在object
上有扩展方法,该怎么办?如果任何方法是重复的,VS应该检查所有类及其方法吗?他们根本就没有制作支票,你应该自己做。