嵌套调用中的C#重载

Jer*_*ews 1 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我观察以下输出:

general
specific
Run Code Online (Sandbox Code Playgroud)

很自然,我很困惑.这里发生了什么?

Mar*_*zek 5

每一个b.CallFoo会导致一般被打印,因为CallFoo需要object的参数.在编译期间确定了正确的方法重载,因此通常只有一个编译器可以在这里选择.

您可以使用dynamicas CallFoo参数类型强制在运行时选择重载:

public void CallFoo(dynamic x)
{
    a.Foo(x);
}
Run Code Online (Sandbox Code Playgroud)

或者你可以自己编写逻辑,在B.CallFoo:

public void CallFoo(object x)
{
    if (x is B)
    {
        a.Foo((B)x);
    }
    else
    {
        a.Foo(x);
    }
}
Run Code Online (Sandbox Code Playgroud)

或直接在a.Foo:

public void Foo(object o)
{
    if (o is B)
    {
        Foo((B)o);
    }
    else
    {
        Console.WriteLine("general");
    }
}
Run Code Online (Sandbox Code Playgroud)