为何getter为internal时,property的setter不能设为protected?
为什么internal属性搭配protected set会触发CS0273错误?
先看报错代码:
internal class VisualControl : IDisposable { internal int Property { get; protected set; } = 4; }
编译器抛出的错误信息:
'VisualControl.Property.set'访问器的可访问性修饰符必须比属性或索引器'VisualControl.Property'的更严格(CS0273)
原因解析
C#有明确语法规则:如果给属性的某个访问器(get/set)单独指定访问修饰符,这个修饰符的可访问范围必须比属性本身的范围更小(更严格)。
对比两种场景:
- 当属性用
public修饰时,protected的set访问器范围明显更小(public允许所有代码访问属性,protected仅允许类自身和它的派生类访问),完全符合规则,因此编译正常。 - 当属性换成
internal时,protected的访问范围和internal是交叉覆盖的:- 同程序集内:
internal允许所有类访问属性的get,protected仅允许自身和派生类访问set,这部分set的范围确实更小; - 但跨程序集时:
internal属性对外部程序集完全不可见,可protected修饰符理论上允许跨程序集的派生类访问set——矛盾的是,外部程序集的派生类根本看不到这个internal属性,这就导致protected的访问性并不比internal更严格,直接违反了语法规则,因此触发CS0273错误。
- 同程序集内:
修复方案
你可以把set的修饰符改成以下两种之一:
private protected:仅允许同程序集内的派生类访问set,范围比internal更小,符合规则;private:仅允许类自身访问set,是最严格的修饰符,完全合规。
内容的提问来源于stack exchange,提问作者no one special
相关产品推荐
相关产品推荐

