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

C#中required关键字:构造函数初始化成员仍报错问题咨询

CS9035错误解析:required属性的正确用法

为什么new("")也会触发CS9035?

C#的required属性要求对象创建时必须完成初始化,但编译器不会自动检测构造函数内部是否给required成员赋了值。要让编译器认可某个构造函数已经搞定了所有required成员的初始化,必须给这个构造函数加上[SetsRequiredMembers]特性。

你写的第二个构造函数虽然在内部给Name赋值了,但没加这个特性,编译器依然判定required成员未被正确初始化,所以报错。

什么是attribute constructor?

这里的attribute constructor指的是被特性标记的构造函数,在这个场景下特指带[SetsRequiredMembers]特性的构造函数。这个特性的作用就是告诉编译器:“这个构造函数已经把所有required成员都初始化好了,不用再强制要求用对象初始化器设置它们”。

修正后的代码示例

void Main()
{
    // 合法:用对象初始化器设置required成员
    TestClass test1 = new() { Name = "示例名称" };
    // 合法:调用标记了SetsRequiredMembers的构造函数
    TestClass test2 = new("示例名称");
}

class TestClass
{
    public required string Name { get; set; }
    
    public TestClass()
    {
        // 如果要让无参构造函数也合法,需要加[SetsRequiredMembers]并给Name赋值
        // Name = "默认名称";
    }
    
    [SetsRequiredMembers] // 关键:添加这个特性
    public TestClass(string name)
    {
        Name = name;
    }
}

补充说明:如果想让无参构造函数也能创建实例,同样要给它加[SetsRequiredMembers],同时必须在构造函数内部给Name赋值,否则即使编译通过,运行时可能会出现未初始化的问题。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:02