使用接口进行类型推断
本文关键字:类型 接口 | 更新日期: 2023-09-27 18:04:50
就在前几天,我遇到了一个bug,实际上我花了很长时间才弄清楚。在通过继承接口执行时,似乎执行了错误的重载。请看下面的代码:
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
我想在这个博客中你可以找到解释:http://csharpindepth.com/Articles/General/Overloading.aspx
当编译器去寻找实例方法重载时,它考虑调用的"目标"的编译时类,和查看在那里声明的方法。如果找不到合适的,然后查看父类…然后是祖父类,等等。这意味着如果有两个方法处于不同的层次层次结构,"更深"的将首先被选择,即使它不是为调用提供"更好的函数成员"