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 The modifier 'override' is not valid for this item 和警告 CS0108 'I1.M()' hides inherited member 'I0.M()'. Use the new keyword if hiding was intendedTargetFramework 设置为 net5.0LangVersionlatest。为什么即使在官方文档中描述它也不起作用?

解决方法

显然,带有 override 关键字的示例不正确,必须删除此关键字。此外,它仅在明确指定方法接口时才有效:

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

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

text 中,它说“不允许隐式覆盖。”

令人困惑的是,紧随其后的 IC 接口并没有重复该语句,同时使用隐式方法,使其看起来像隐式方法是有效的IC 似乎是您复制的界面。