在 C# 8 中,接口已升级为允许
protected
成员以及其他访问修饰符。当时,实现类需要显式实现这样的protected
接口成员。
所以,在 C# 8 下这段代码:
public interface IFoo
{
protected void Method();
}
public class Foo : IFoo
{
public void Method()
{
}
}
产生此编译错误:
CS8704 'Foo' does not implement interface member 'IFoo.Method()'. 'Foo.Method()' cannot implicitly implement a non-public member.
我最近没有编写任何利用此“功能”的代码(强制隐藏实现者特定的帮助方法以防止正常的公共访问),但最近我注意到不再需要显式实现。上面的代码片段现在可以正常编译(至少从 C# 11 开始)。为什么/什么时候发生这种变化?我找不到有关更改的任何文档或讨论,它是由于其他语言更改而偶然发生的吗?
此功能称为“默认接口方法”,您可以在本文中找到更多信息:使用默认接口方法更新接口。
这确实是一项为了提高语言灵活性等而实现的功能。在基础知识页面您可以在“接口”部分看到他们解释了同样的事情:
从 C# 8.0 开始,接口可以定义默认实现 对于其部分或全部成员。实现的类或结构 接口不必实现具有默认值的成员 实施。