如何调用默认方法而不是具体实现

How can I call the default method instead of the concrete implementation

为什么默认接口方法的行为在 C# 8 中发生了变化? 过去如下代码(当Default interface methods demo没有发布时):

interface IDefaultInterfaceMethod
{
    // By default, this method will be virtual, and the virtual keyword can be here used!
    virtual void DefaultMethod()
    {
        Console.WriteLine("I am a default method in the interface!");
    }

}

interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
    void IDefaultInterfaceMethod.DefaultMethod()
    {
        Console.WriteLine("I am an overridden default method!");
    }
}

class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}

class Program
{
    static void Main()
    {
        IDefaultInterfaceMethod anyClass = new AnyClass();
        anyClass.DefaultMethod();

        IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
        anyClassOverridden.DefaultMethod();
    }
}

具有以下输出:

控制台输出:

I am a default method in the interface!
I am an overridden default method!

但是在 C# 8 的最后一个版本中,上面的代码产生了以下输出:

控制台输出:

I am an overridden default method!
I am an overridden default method!

任何人都可以向我解释为什么会改变这种行为?

注:

IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();

((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??

我想更好的问题是:

How can I call the default method instead of the concrete implementation?

该功能已计划但 cut from C# 8 in April 2019,因为有效的实施需要运行时的支持。这无法在发布前及时添加。该功能必须适用于 C# 和 VB.NET - F# 无论如何都不喜欢接口。

if B.M is not present at run time, A.M() will be called. For base() and interfaces, this is not supported by the runtime, so the call will throw an exception instead. We'd like to add support for this in the runtime, but it is too expensive to make this release.

We have some workarounds, but they do not have the behavior we want, and are not the preferred codegen.

Our implementation for C# is somewhat workable, although not exactly what we would like, but the VB implementation would be much more difficult. Moreover, the implementation for VB would require the interface implementation methods to be public API surface.

它将through a base() call 与类 的工作方式类似。复制提案示例:

interface I1
{ 
    void M(int) { }
}

interface I2
{
    void M(short) { }
}

interface I3
{
    override void I1.M(int) { }
}

interface I4 : I3
{
    void M2()
    {
        base(I3).M(0) // What does this do?
    }
}