为什么可以覆盖显式实现?

Why its possible to override explicit implementation?

当直接从实现者那里访问接口成员是不对的时候,我们通常会显式地实现接口class。天气它必须是内部的,或者它会导致与 API 设计的冲突,或者当它增加滥用方法的机会时。

在我看来绝对不鼓励为具有不同逻辑的多个接口单独实现成员,所以这里不是这种情况

编译器不允许虚拟这样的实现,因为它没有意义,我认为这是正确的。通常显式实现是非常敏感的,这就是你试图隐藏它的原因。

但是我发现了以下覆盖显式实现的方法(它不完全是覆盖,而是作弊的替代方法)

我发现这令人惊讶且非常失望。我的问题是为什么允许使用以下代码并且可以完美运行?我预计会收到接口已明确实现的错误。

这只是重现问题的基本示例

static void Main(string[] args)
{
    var b = new Base();
    ((IInterface)b).Write();

    var c = new Child();
    ((IInterface)c).Write();
}
public interface IInterface
{
    void Write();
}
public class Base : IInterface
{
    void IInterface.Write()
    {
        Console.WriteLine("Base");
    }
}
public class Child : Base, IInterface // hack is here. Re Implemented :/
{
    void IInterface.Write()
    {
        Console.WriteLine("Child");
    }
}

Outputs

    Base
    Child

我建议您考虑从 C# 到本机代码的低级别转换:接口继承重新声明及其一个或多个方法覆盖,强制重写 VMT - 虚拟方法 Table (接口方法在设计上是虚拟的。

why following code is allowed and works perfectly?

因为规格是这样说的:

It is a compile-time error for an explicit interface member implementation to include access modifiers, and it is a compile-time error to include the modifiers abstract, virtual, override, or static.

然而在多态性中,俗话说 "the more derived type knows better",再次来自规范:

derived classes can extend and specialize base classes

因此,当您调用该接口成员时,将调用显式实现该接口的最派生类型。