给出以下内容:
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)
很自然,我很困惑.这里发生了什么?
每一个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)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |