为何C#中required无法与私有init及私有构造函数搭配使用?
C# required属性访问器可见性编译错误解析
问题代码
public record Example { public required string Property { get; private init; } private Example() { } public static Example Create(string property) => new Example { Property = property }; }
编译错误
Required member 'Property' cannot be less visible or have a setter less visible than the containing type 'Example'
问题原因
这是因为C#编译器对required成员的可见性规则是基于类型声明层面的静态检查,不会去分析类型内部的构造逻辑或者实例创建的实际路径:
required属性的设计目的是确保任何合法创建该类型实例的代码都必须初始化这个属性,编译器需要保证在所有允许创建实例的上下文中,都能访问到该属性的setter来完成初始化。- 虽然代码里用私有构造函数限制了外部直接创建实例,但编译器不会做这种上下文依赖的分析——它只看类型本身的可见性(
public)和required属性setter的可见性(private),只要后者低于前者,就会触发错误,不管实际有没有外部代码能用到这个setter。
解决办法
- 将
init访问器的可见性改为public,符合编译器的可见性规则; - 如果不需要对外暴露
Example类型,可以将其改为非public; - 去掉
required修饰符,因为静态工厂方法已经确保Property一定会被初始化,无需依赖required的编译检查。
内容的提问来源于stack exchange,提问作者Tenelles
相关产品推荐
相关产品推荐

