【发布时间】:2012-08-24 13:39:05
【问题描述】:
我有基类A
public class A
{
public virtual void Method(A parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public virtual void Method(B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
继承B
public class B : A
{
public virtual void Method(object parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public override void Method(A parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public override void Method(B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
带有扩展方法的静态类S
public static class S
{
public static void Method(this B instance, B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
例如我们创建B类型的实例并在其上调用Method,我们期望它是public override void Method(B parameter)实际结果是public virtual void Method(object parameter)。
var b = new B();
b.Method(new B()); // B.Method (Object parameter) Why???
为什么编译器不选择更合适的方法??? UPD 为什么它不是扩展方法?
【问题讨论】:
-
B不是嵌套的而是继承的。 -
如果对象具有同名的方法,则不会调用扩展方法。这是为了避免破坏旧代码,期望调用旧方法而不是新扩展。
标签: c# .net overloading overriding