使用接口进行类型推断

本文关键字:类型 接口 | 更新日期: 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

当编译器去寻找实例方法重载时,它考虑调用的"目标"的编译时类,和查看在那里声明的方法。如果找不到合适的,然后查看父类…然后是祖父类,等等。这意味着如果有两个方法处于不同的层次层次结构,"更深"的将首先被选择,即使它不是为调用提供"更好的函数成员"