我开始明白我不明白正在发生什么。在C#中有以下行为:
public class Base
{
public void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
它将打印
public void Method(B a)
而不是
public void Method(D a)
这很令人惊讶。我认为这种行为的原因是方法表的实现。CLR如果在当前类型中找到相应的方法,就不会在基类中搜索方法。我认为他们试图提高性能。
但是下面的代码完全让我失望:
public class Base
{
public virtual void Method(D a)
{
Console.WriteLine("public void Method(D a)");
}
}
public class Derived: Base
{
public override void Method(D a)
{
Console.WriteLine("public override void Method(D a)");
}
public void Method(B a)
{
Console.WriteLine("public void Method(B a)");
}
}
public class B { }
public class D: B { }
class Program
{
static void Main(string[] args)
{
Derived derived = new Derived();
D d = new D();
derived.Method(d);
}
}
它会打印
public void Method(B a)
而不是
public override void Method(D a)
这太可怕且难以预测了。
有人可以解释一下吗?
我认为方法表中仅包含当前类型实现的方法(不包括重写方法),并且CLR在找到任何可调用的方法后停止查找相应的方法。我对吗?