gpt4 book ai didi

C# 在嵌套调用中重载

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:34 25 4
gpt4 key购买 nike

给出以下内容:

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,因为CallFooobject 作为参数。正确的方法重载是在编译期间确定的,因此一般是编译器在这里唯一可以选择的。

您可以通过使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com