我遵循本指南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.0
,langversion
为最新
。为什么即使在官方文件中有描述也不起作用?
从提到的文件来看:
允许重写声明显式重写特定的基接口方法,方法是使用接口名称限定声明(在这种情况下不允许访问修饰符)。不允许隐式重写。
所以你得用这个:
interface I0
{
void M() { Console.WriteLine("I0"); }
}
interface I1 : I0
{
override void I0.M() { Console.WriteLine("I1"); }
}
在文本中,它说“不允许隐式重写”。
令人困惑的是,在使用隐式方法时,后面的ic
接口并不重复该语句,使其看起来像隐式方法是有效的。而ic
似乎是您复制的接口。