给出以下内容:
class A
{
public void Foo(object o)
{
Console.WriteLine("general");
}
public void Foo(B o)
{
Console.WriteLine("specific");
}
}
class B
{
A a = new A();
public void CallFoo(object x)
{
a.Foo(x);
}
public static void Main()
{
B b = new B();
b.CallFoo(b);
b.a.Foo(b);
}
}
我观察到以下输出:
general
specific
很自然地,我感到困惑。这是怎么回事?
最佳答案
每个b.CallFoo
都会打印general,因为CallFoo
将object
作为参数。正确的方法重载是在编译期间确定的,因此一般是编译器在这里唯一可以选择的。
您可以通过使用 dynamic
作为 CallFoo
参数类型强制在运行时选择重载:
public void CallFoo(dynamic x)
{
a.Foo(x);
}
或者您可以自己编写逻辑,在 B.CallFoo
中:
public void CallFoo(object x)
{
if (x is B)
{
a.Foo((B)x);
}
else
{
a.Foo(x);
}
}
或直接在 a.Foo
中:
public void Foo(object o)
{
if (o is B)
{
Foo((B)o);
}
else
{
Console.WriteLine("general");
}
}
关于C# 在嵌套调用中重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20084260/