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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:41:01