C# 在嵌套调用中重载

标签 c# overloading

给出以下内容:

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/

相关文章:

c# - C# 可以提供 static_assert 吗?

c# - 如何将由垂直线分隔的段落文本添加到 itextsharp 创建的 PDF 中

c++ - "hidden overloaded virtual function"超过 2 个类

c++ - 跨命名空间重载函数是否一定很困难?

c# - EF、ASP.NET Web API 和 JSON.NET - 返回限制层次结构

c# - 如何在 C# 中使用通用数据库连接调用存储过程?

c# - 防止代码清理在 Resharper 中创建文件头

typescript - TypeScript 中的函数重载与使用联合类型

c++ - 当 operator<<() 失败时回退到 to_string()

c# - 如何告诉构造函数它应该只使用原始类型