就在前几天我遇到一个实际上花了一些时间才弄清楚的错误。 不知何故,当通过继承接口执行时,似乎执行了错误的重载。看看这段代码。
class Program
{
static void Main(string[] args)
{
IBar bar = new Bar();
bar.Execute("TEST");
}
}
public interface IFoo
{
void Execute(string value);
}
public interface IBar : IFoo
{
void Execute(object value);
}
public class Foo : IFoo
{
public void Execute(string value)
{
Console.WriteLine("Foo.Execute - string");
}
}
public class Bar : IBar
{
public void Execute(string value)
{
Console.WriteLine("Bar.Execute - string");
}
public void Execute(object value)
{
Console.WriteLine("Bar.Execute - object");
}
}
该程序的输出是" Bar-Execute - object"对我来说似乎有点奇怪,因为通过继承的IFoo接口可以获得更具体的重载。任何人都可以解释这种行为吗?
祝你好运
Bernhard Richter
答案 0 :(得分:3)
我认为在这篇博客中你可以找到解释:http://csharpindepth.com/Articles/General/Overloading.aspx
当编译器寻找实例方法重载时,它 考虑调用的“目标”的编译时类,和 看看那里宣布的方法。如果找不到合适的东西, 然后它会查看父类......然后是祖父母类等。 这意味着如果在不同级别有两种方法 层次结构,首先选择“更深层次”,即使它不是a 呼叫的“更好的功能成员”。