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

为什么在C#8中更改了默认接口方法的行为?
过去,以下代码(当未发布默认接口方法的演示时):

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();
    }
}

具有以下输出:

控制台输出:

我是界面中的默认方法!
我是一个覆盖的默认方法!

但是,使用最新版本的C#8,上面的代码将产生以下输出:

控制台输出:

我是一个覆盖的默认方法!
我是一个覆盖的默认方法!

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

注意:

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

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

参考方案

我怀疑一个更好的问题是:

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

该功能是经过计划的,但为cut from C# 8 in April 2019,因为有效的实现需要运行时的支持。无法在发布前及时添加。该功能必须同时适用于C#和VB.NET-F#仍然不喜欢接口。

如果运行时不存在B.M,则将调用A.M()。对于base()和interfaces,运行时不支持此功能,因此调用将引发异常。我们想在运行时中添加对此的支持,但是发布此版本太昂贵了。
我们有一些解决方法,但是它们没有我们想要的行为,也不是首选的代码生成器。
尽管不是我们想要的那样,我们对C#的实现还是可行的,但是VB的实现会困难得多。此外,VB的实现将要求接口实现方法是公共API表面。

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?
    }
}

从Java接口中的默认方法调用方法 - java

这可能是愚蠢的问题。但我想知道这样做的可能性。假设我有类似的界面public interface GroupIdentifier { Integer getRevision(); } 我需要另一个名为getNextRevision的方法。所以我能做的是,在同一接口内实现默认方法并返回下一个数字。例如:public interface GroupIdentif…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

LeetCode题解圆上任取三点构成锐角三角形的概率

来自字节跳动的一道几何题题解:1/4