using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new Derived();
            int x = 123;
            a.Foo(x);
        }
    }
    public class Base
    {
        public virtual void Foo(int x)
        {
            Console.WriteLine("Base::Foo");
        }
    }
    public class Derived : Base
    {
        public override void Foo(int x)
        {
            Console.WriteLine("Derived::Foo(int x)");
        }
        public void Foo(object o)
        {
            Console.WriteLine("Derived::Foo(object o)");
        }
    }
}
结果:"Derived :: Foo(object o)"
为什么???
Jon*_*eet 20
当编译器尝试寻找候选方法签名,准备重载,它着眼于最派生类型第一,并去除覆盖的方法只有在"新申报"在类的签名看.
如果它找到了一个适用的方法,它就不会继续进行继承链以查找其他签名.在这种情况下,这是违反直觉的(至少与我的直觉相反).它的设计,以避免"脆基类"的问题,在这里改变的基类影响以出乎意料的方式其他代码-但是当该方法实际上是覆盖在派生类中,我看不到好处.(不可否认,这意味着看似无操作的方法,只是为了调用基础实现来覆盖方法,并不像你预期的那样安全可移除.)
关于这种情况和其他极端情况,我有一篇相当长的文章会对一些细节进行重载 - 你可能会觉得它很有用.有关更多详细信息,请参阅C#规范的7.5.3节.
底线:注意重载,尤其是跨越继承边界.