为什么重载不起作用?

时间:2014-02-12 04:31:27

标签: c# overloading

为什么启动程序后会显示C::Foo(object o)

using System;

namespace Program
{
    class A
    {
        static void Main(string[] args)
        {
            var a = new C();
            int x = 123;
            a.Foo(x);
        }
    }

    class B
    {
        public virtual void Foo(int x)
        {
            Console.WriteLine("B::Foo");
        }
    }

    class C : B
    {
        public override void Foo(int x)
        {
            Console.WriteLine("C::Foo(int x)");
        }

        public void Foo(object o)
        {
            Console.WriteLine("C::Foo(object o)");
        }
    }
}

我无法理解为什么当您致电C :: Foo时,选择object的方法,而不选择int。什么是类B,该方法被标记为覆盖?

在类C中,有两个方法具有相同的名称但参数不同,是否没有重载?为什么不?在父母中重写的方法之一是否重要?它以某种方式禁用了重载?

2 个答案:

答案 0 :(得分:9)

查看Member lookup

  

首先,名为N的所有可访问(第3.5节)成员的集合   在T中声明并且构造了T的基本类型(第7.3.1节)。   从集合中排除包含覆盖修饰符的声明。如果没有名为N的成员存在且可访问,则查找   不产生匹配,并且不评估以下步骤。

所以根据这个,它会使用

public void Foo(object o)

第一

答案 1 :(得分:4)

  包含替代修饰符的

Declarations将从集合中排除。

Overloading base method in derived class

Derived class using the wrong method

而是使用override您应该使用 new

public new void Foo(int x)
{
    Console.WriteLine("C::Foo(int x)");
}

public void Foo(object o)
{
    Console.WriteLine("C::Foo(object o)");
}