带required属性的类使用复制构造函数为何触发CS9035错误?
解决C# required属性与复制构造函数的CS9035错误
你定义的Class1包含required属性Name,虽然复制构造函数里已经把源实例的Name赋值给新对象,但编译器还是抛出CS9035错误——原因是C#编译器无法自动识别自定义构造函数是否完成了required成员的初始化,必须显式标记构造函数已处理这些成员。
解决方案
给复制构造函数添加[SetsRequiredMembers]特性,明确告诉编译器该构造函数已经完成了所有required成员的初始化。
修改后的代码
public class Class1 { public required string Name {get; set;} public Class1(){} [SetsRequiredMembers] public Class1(Class1 src) { Name = src.Name; } } public class OtherClass { public void func() { var data = new Class1 { Name = "test" }; // 现在可以正常编译 var data1 = new Class1(data); } }
补充说明
你的无参构造函数没有初始化required成员,但它配合对象初始化器使用是合法的(比如代码里的var data = new Class1 { Name = "test" }),因为对象初始化器会负责设置required属性,这符合C#对required成员的规则要求。
内容的提问来源于stack exchange,提问作者Matt Zappitello
相关产品推荐
相关产品推荐

