首页 > 解决方案 > C# 覆盖默认接口方法

问题描述

是否可以在另一个接口中覆盖默认接口方法?

假设我有以下代码:

public class Program
{
    public static void Main()
    {
        IOriginal origOrig = new Original();
        IOriginal origInh = new Inherited();
        IInherited inherited = new Inherited();
        
        Console.WriteLine($"IOriginal Original: {origOrig.Method()}");
        Console.WriteLine($"IOriginal Inherited: {origInh.Method()}");
        Console.WriteLine($"IInherited Inherited: {inherited.Method()}");
    }
}

public interface IOriginal
{
    string Method() => "original";
}

public interface IInherited : IOriginal
{
    string Method() => "inherited";
}

public class Inherited : IInherited {}
public class Original : IOriginal {}

输出是

IOriginal Original: original
IOriginal Inherited: original
IInherited Inherited: inherited

但是,我想覆盖IInherited接口中的方法,所以它会产生这个:

IOriginal Original: original
IOriginal Inherited: inherited
IInherited Inherited: inherited

C# 8 规范提案中,它是通过这样做提出的:

interface IA
{
    void M() { WriteLine("IA.M"); }
}
interface IB : IA
{
    override void IA.M() { WriteLine("IB.M"); } // explicitly named
}
interface IC : IA
{
    override void M() { WriteLine("IC.M"); } // implicitly named
}

但在正式发布时,它不起作用?

Compilation error: The modifier 'override' is not valid for this item

有什么办法可以做到这一点?

标签: c#.net.net-5

解决方案


使用:

interface IB : IA
{
    void IA.M() { WriteLine("IB.M"); } // explicitly named
}

似乎工作

但是我找不到任何 C# 文档说这是正确的语法!


推荐阅读