如何使用命名参数初始化C# Record?初始化报错求助
问题解答:C# Record无法使用对象初始化器的原因与解决方法
你定义的是位置记录(Positional Record),这种写法会自动生成带对应参数的主构造函数,但默认不会生成无参构造函数。而对象初始化器语法({ ... })的本质是先调用无参构造创建实例,再给属性赋值,因此会触发报错。
解决方法有以下几种:
1. 用命名参数调用主构造函数(推荐,符合Record设计初衷)
直接通过命名参数传递值,既保持可读性,又适配位置记录的语法:
var p = new Person(Name: "Tim", Age: 40, Income: 55);
2. 改用显式属性定义的Record
如果坚持要用对象初始化器,可以把Record改成显式声明属性的形式,此时编译器会自动生成无参构造函数:
public record Person { public string Name { get; init; } public int Age { get; init; } public double Income { get; init; } } // 正常使用对象初始化器 var p = new Person { Name = "Tim", Age = 40, Income = 55 };
3. 给位置Record添加无参构造函数
如果想同时保留位置参数的便利和对象初始化器的用法,可以手动添加无参构造函数(需通过主构造函数重载给属性赋默认值):
public record Person(string Name, int Age, double Income) { public Person() : this("", 0, 0) { } } // 现在可以使用对象初始化器 var p = new Person { Name = "Tim", Age = 40, Income = 55 };
内容的提问来源于stack exchange,提问作者LaloInDublin
相关产品推荐
相关产品推荐

