Eug*_*mov 0 c# access-modifiers c#-8.0
界面:
interface IMyInterface{
internal int Property {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
班级:
public class MyClass: IMyInterface{
internal int Property {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
结果: CS8704 错误:MyClass 未实现接口成员 Property.get MyClass 无法隐式实现非公共成员。
为什么我必须显式实现接口?
“为什么是这样的语言”的简单答案是“因为这就是语言设计者指定它的方式”。
那么,他们为什么要这样设计呢?我找到的一些官方注释是这些。看来主要问题是实施者必须拥有什么样的访问权限:
我们是否允许隐式实现非公共接口成员?如果可以,那么实现方法的可访问性要求是什么?一些选项:
- 必须是公开的
- 必须具有完全相同的可访问性
- 必须至少是可访问的
他们决定:
现在,我们只是不允许这样做。只有公共接口成员可以隐式实现(并且只能由公共成员隐式实现)。
“现在”从未改变,因此从 C# 8 开始,接口可以具有非公共虚拟成员,但类只能显式实现它们。
我可以推测他们可能决定反对这样的隐式覆盖的几个原因:
override。看到受保护和/或内部方法但没有意识到它正在履行接口契约可能会被认为是令人困惑的。(公共方法大概被认为可以免除这个问题,因为这就是它们一直工作的方式,并且公共方法无论如何都是类公共契约的一部分,因此修改/删除它们已经会导致读者考虑代码的其他部分这取决于它。)另请参阅默认接口方法提案中关于此问题的注释。