使用接口键入推断

时间:2014-05-24 13:39:00

标签: c# inheritance interface clr

就在前几天我遇到一个实际上花了一些时间才弄清楚的错误。 不知何故,当通过继承接口执行时,似乎执行了错误的重载。看看这段代码。

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

1 个答案:

答案 0 :(得分:3)

我认为在这篇博客中你可以找到解释:http://csharpindepth.com/Articles/General/Overloading.aspx

  

当编译器寻找实例方法重载时,它   考虑调用的“目标”的编译时类,和   看看那里宣布的方法。如果找不到合适的东西,   然后它会查看父类......然后是祖父母类等。   这意味着如果在不同级别有两种方法   层次结构,首先选择“更深层次”,即使它不是a   呼叫的“更好的功能成员”。