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

为何无法隐式实现非公共接口成员?——CS8704错误下需显式实现接口的疑问

为什么无法用隐式方式实现非公共接口成员?

先还原你遇到的代码场景,方便大家理解问题:

// 接口定义
interface IMyInterface{ 
    internal int Property {get; set;} 
}

// 尝试隐式实现的类
public class MyClass: IMyInterface{ 
    internal int Property {get; set;} 
}

运行这段代码时,编译器会抛出CS8704错误:MyClass does not implement interface member Property.get MyClass cannot implicitly implement a non-public member

核心原因:C#的设计规则限制

这其实是C#编译器的明确规定:当接口成员带有非公共访问修饰符(比如internal、private)时,只能通过显式接口实现来完成,不能用隐式实现。

背后的设计逻辑可以从两个角度理解:

  • 隐式实现的本质是让类的成员同时承担「类自身成员」和「接口成员」两个身份。但非公共接口成员的设计意图是限制其可见范围(比如internal只能在当前程序集内访问),如果用隐式实现,类的成员会暴露成类的可访问成员,这和接口成员的非公共设计初衷冲突。
  • 显式实现的接口成员,只能通过接口类型来访问,完全依附于接口的可见性规则,不会成为类自身的可访问成员。这正好匹配非公共接口成员的使用场景——只有在接口上下文中才能访问该成员,而不是直接通过类实例调用。

解决方法:改用显式实现

把代码改成显式实现的形式,就能解决这个错误:

interface IMyInterface{ 
    internal int Property {get; set;} 
}

public class MyClass: IMyInterface{ 
    // 显式实现接口成员,不需要加访问修饰符
    int IMyInterface.Property {get; set;} 
}

这种方式下,Property成员只能通过IMyInterface类型的实例访问,其可见性严格遵循接口成员的internal限制,完全符合编译器的要求。

内容的提问来源于stack exchange,提问作者Eugeniy Maksimov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:19:04