C# 8中接口无实现成员允许public修饰符是否为预期行为?
public的设计依据与用途 这个问题问到点子上了——C# 8引入接口默认实现(Default Implementations in Interfaces)时,确实顺带放宽了接口成员的访问修饰符规则,允许给没有默认实现的接口成员显式标注public,这可不是疏漏,而是语言设计团队有意为之的调整。
设计依据
语法一致性
当接口中同时存在带默认实现的成员(这类成员必须显式指定访问修饰符,因为它们支持private/protected internal等非public级别)和传统无实现成员时,允许后者也标注public,能让整个接口的代码风格保持统一。不用再区分“有没有默认实现”来决定是否写访问修饰符,降低了认知负担。明确性与可读性
虽然接口成员的默认访问级别就是public,但显式标注public能让代码意图更清晰,尤其是对于刚接触代码的开发者,或者团队有“显式声明所有成员访问级别”的编码规范时,这个语法让接口也能遵守统一的规范,避免隐式规则带来的困惑。未来兼容性
这个调整也为后续C#的语言扩展预留了空间。比如未来如果接口成员支持更多访问级别的调整,显式标注public的代码无需修改就能适配,提前兼容可能的语法变化。
实际用途
统一编码风格:假设你的接口混合了两种成员:
public interface ISimple { // 带默认实现的成员,必须显式加public public string SimonWithDefault => "met a pie man"; // 无实现的成员,现在也可以显式加public,风格统一 public string Simon { get; } }这样的写法比一部分加
public一部分不加要更整齐,符合多数团队的代码整洁要求。适配团队规范:很多团队要求所有类、接口的成员都必须显式声明访问修饰符,避免依赖隐式规则。C#8之前接口里写
public会报错,现在这个语法完美满足了这类规范的需求。消除歧义场景:在一些复杂的代码结构中(比如嵌套接口、接口与外部类型有命名冲突时),显式标注
public能明确成员的可见性,让代码阅读者一眼就能确定这个成员的访问级别,无需回忆接口的隐式规则。
内容的提问来源于stack exchange,提问作者Binary Worrier

