调用隐藏接口方法

Calling hidden interface method

我尝试使用新的 C# 默认接口方法。谁能解释下面的代码以及为什么会这样?

最小测试示例:

public static void Main()
{
    Class c = new Class();
    IInterface i = new Class();
    c.M1();
    i.M1();
    (i as IInterface).M1();
    Class2 c2 = new Class2();
    Class2Base c2b = new Class2();
    c2.M2();
    c2b.M2();
    (c2 as Class2Base).M2();
}

public interface IInterface
{
    public void M1() => Console.WriteLine("Call from interface");
}

public class Class : IInterface
{
    public void M1() => Console.WriteLine("Call from class");
}

public class Class2 : Class2Base
{
    public void M2() => Console.WriteLine("Call from class2");
}

public class Class2Base
{
    public void M2() => Console.WriteLine("Call from class2base");
}

输出:

Call from class
Call from class
Call from class
Call from class2
Call from class2base
Call from class2base

我希望在第二次调用中看到 "Call from interface" 类似于在第二个示例中使用正常继承时的情况。

总结一下:

为什么接口方法被隐藏了,(也许)我怎么还能调用它。

此外,这是我的第一个问题,欢迎任何提示

Why is the interface method hidden?

默认接口方法就是这样。如果没有提供其他实现,接口中的方法是默认实现

在您的每一个案例中,您都提供了一个实现,因此不会使用默认值。

当您提供非默认实现时,我们假设新实现比默认实现更好;如果不是更好,你不会提供它,对吧?您不会无缘无故地完成工作,并且大概您希望您的工作得到使用。当存在更好的实现时,运行时调用默认实现是愚蠢的。

How can I still call it?

在你的代码中,你没有。

如果您希望始终有一个可以调用的默认实现,您可以这样做:

public interface IInterface
{
    public void M1() => MyHelperMethods.M1(this);
}

public static class MyHelperMethods
{
    public static void M1(IInterface i) => 
      Console.WriteLine("Call from static");
}

现在如果您想调用默认实现,您可以直接调用 MyHelperMethods.M1