You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:实现接口非公开成员需指定public?VS重写提示存疑

关于C#接口非公开方法实现的疑问

我阅读了微软关于C#8开始允许接口默认方法实现及访问修饰符的文章,但无法理解:为何在类中实现接口的非公开方法时,必须指定public访问修饰符?若使用与接口相同的修饰符,该方法不会被视为实现类的已实现方法。

示例代码如下:

interface aa {
    protected internal void jj();
    internal void jj1();
    protected void jj2();
    private protected void jj3();

    protected internal void ff() { }
    internal void ff1() { }
    protected void ff2() { }
    private protected void ff3() { }

}
class bb:aa {
    public void jj() { }
    public void jj1() { }
    public void jj2() { }
    public void jj3() { }

    public void ff() { }
    public void ff1() { }
    public void ff2() { }
    public void ff3() { }
}

编辑补充:从评论得知我可能仅在重写公开成员,但Visual Studio提示我确实在重写,这是为何?


解答

C#里接口的成员本质上是公开的行为契约,哪怕给接口成员加了protected internal这类修饰符,也只是限制了这些成员的可访问范围,并没有改变它们作为接口契约的核心属性——类实现接口就是要兑现这个契约,所以实现的方法必须声明为public,才能保证通过接口引用的代码能正常调用到这些方法。

至于Visual Studio的“重写”提示,其实是个容易混淆的表述:接口的默认方法是接口自带的默认实现,你在类里写的同名方法并不是传统意义上的override(重写基类方法),而是在实现并替换接口的契约默认实现。VS把这个行为标注为“重写”,是从“替换默认实现”的角度出发的,但本质上还是接口契约的实现,所以必须遵循接口实现的规则——用public修饰符。

如果在类里用和接口相同的修饰符声明方法,编译器会把这个方法当成类自身的私有/受保护成员,而非接口契约的实现。这是因为接口的设计初衷是定义公共行为约定,只有公开的方法才能满足契约的通用性要求。

内容的提问来源于stack exchange,提问作者Eric Movsessian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:45:40