提问者:小点点

C#默认接口实现-不能重写


我遵循本指南https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods使用默认接口实现功能。我复制了一段在接口ia中定义默认实现的代码,然后在接口ib中重写它:

interface I0
{
    void M() { Console.WriteLine("I0"); }
}

interface I1 : I0
{
    override void M() { Console.WriteLine("I1"); }
}

但它给出了一个错误CS0106修饰符“override”对此项无效和一个警告CS0108“i1.m()”隐藏继承的成员“i0.m()”。如果要隐藏,请使用new关键字targetframework设置为net5.0langversion最新。为什么即使在官方文件中有描述也不起作用?


共2个答案

匿名用户

从提到的文件来看:

允许重写声明显式重写特定的基接口方法,方法是使用接口名称限定声明(在这种情况下不允许访问修饰符)。不允许隐式重写。

所以你得用这个:

interface I0
{
    void M() { Console.WriteLine("I0"); }
}

interface I1 : I0
{
    override void I0.M() { Console.WriteLine("I1"); }
}

匿名用户

在文本中,它说“不允许隐式重写”。

令人困惑的是,在使用隐式方法时,后面的ic接口并不重复该语句,使其看起来像隐式方法是有效的。而ic似乎是您复制的接口。