C# 11 required成员误报:实例化派生记录B触发CS9035错误
解决CS9035错误:基类构造已设置required字段仍报错的问题
问题原因
编译器的required成员检查机制不会自动跟踪基类构造函数对required字段的赋值——即便你在基类A的构造里已经给FieldA完成赋值,创建派生类B的实例时,编译器依然会强制要求在对象初始化器中显式设置该字段,从而触发CS9035错误。
解决方案
给派生类B的构造函数添加[SetsRequiredMembers]属性,显式告知编译器该构造函数已完成所有required成员的初始化(包括基类的)。这样既消除了编译错误,又能避免record B的使用者手动设置FieldA。
修改后的代码
using System.ComponentModel; // 需引入该命名空间使用SetsRequiredMembers属性 public record A { public A(string value) { FieldA = value; } required public string FieldA { get; init; } } public record B { [SetsRequiredMembers] public B() : base("field a") { } } public static class Test { public static void test() { var b = new B(); // 编译通过,无需额外设置FieldA } }
补充说明
[SetsRequiredMembers]属性的作用是告诉编译器:该构造函数已正确初始化所有标记为required的成员,无需再强制要求在对象初始化器中设置。- 调整后,
B的使用者只需调用new B()即可创建实例,完全不需要接触FieldA,符合“不希望使用者设置该字段”的需求。
内容的提问来源于stack exchange,提问作者Xiaoguo Ge
相关产品推荐
相关产品推荐

