C#自动实现属性仅用set访问器报错的原因与解决方法
C#只写自动实现属性报错的原因与解决办法
报错原因
C#编译器对自动实现属性的设计有明确限制:自动实现属性必须至少包含一个get访问器。
当你编写public int A { set; }时,编译器无法为其生成合理的私有后备字段——因为这个字段的值永远无法被读取(没有get访问器),这种设计在逻辑上没有实际价值,所以编译器拒绝自动生成,要求你必须手动为set访问器编写主体(就像类E那样),或者将属性标记为abstract/extern(但这显然不是你需要的场景)。
认知误区
你误以为自动实现属性支持所有访问器组合,但实际上只写的自动实现属性不符合C#的设计规范——编译器认为这种属性没有存在的意义,因为设置的值无法被任何代码获取,所以不提供自动生成支持。
解决办法
- 手动声明后备字段(若坚持只写属性):如果确实需要对外暴露只写属性,只能像类E一样手动实现,这是唯一可行的方式:
class C { private int _a; public int A { set => _a = value; } } - 调整属性设计(更推荐方案):通常只写属性是反模式,设置后无法读取的值几乎没有实用场景。如果允许类内部读取该值,可以改用内部可读、外部只写的自动实现属性,既保留简洁性又满足需求:
class C { public int A { private get; set; } }
内容的提问来源于stack exchange,提问作者William James
相关产品推荐
相关产品推荐

