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

如何使用命名参数初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:41:02