为什么启动程序后会显示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
中,有两个方法具有相同的名称但参数不同,是否没有重载?为什么不?在父母中重写的方法之一是否重要?它以某种方式禁用了重载?
答案 0 :(得分:9)
首先,名为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)");
}