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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:22:33