输出:
B->你好!来自Explicit。

不应该是吗?
A->你好!来自Explicit。

为什么不从类A显式转换(IHello)a调用IHello.Hello()?

interface IHello
{
    void Hello();
}

class A : IHello
{

    public virtual void Hello()
    {
        Console.WriteLine("A->Hello!");
    }

    void IHello.Hello()
    {
        Console.WriteLine("A->Hello! from Explicit.");
    }
}

class B : A, IHello
{
    public override void Hello()
    {
        Console.WriteLine("B->Hello!");
    }

    void IHello.Hello()
    {
        Console.WriteLine("B->Hello! from Explicit.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        A a = new B();
        ((IHello)a).Hello();
    }
}

最佳答案

不,不应该。

Hello的调用等效于已注释掉的调用-获取IHello的途径无关紧要(除非需要执行时间检查或转换);无论哪种方式,编译时类型都是IHello,并且接口(interface)映射是相同的,但是您到达那里。

当在类型层次结构中多次明确地实现一个接口(interface)时,将使用最派生类型的实现。 (通过接口(interface)调用时。)

根据C#3.0规范的第13.4.4节:

关于C#-具有继承的显式接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1856516/

10-11 23:40