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
相关产品推荐
相关产品推荐

