按名称初始化 - C# Records?

3

我在理解如何使用命名参数初始化C#记录时遇到了困难。这显然适用于具有get; set;(或init)属性的更传统的类。我是否错过了一些特殊的语法?原因是我更喜欢这种初始化方式,以使代码更易读。谢谢

public record Person(string Name, int Age, double Income); 

//this does not work
var p = new Person { Name = "Tim", Age = 40, Income = 55 };

Error Message


1
你声明的记录 - 是一个带有三个参数构造函数的记录,但在实例化时,你将它们设置为记录属性。 - OlegI
2
var p = new Person(Name : "Tim", Age : 40, Income : 55 ); - Dmitry Bychenko
1个回答

3

你所做的事情不会起作用,因为在底层会生成一个三个参数的构造函数。记录语法只是一种语法糖,它会被转换成一个带有某些相等性约定的普通类。

你想要做的需要一个无参构造函数。

你有两个选择,使用带有命名参数的构造函数:

var p = new Person( Name: "Tim", Age: 40, Income: 55);

或者扩展你的record,添加一个无参构造函数:

public record Person
{
    public Person(string name, int age, double income)
    {
        Name = name;
        Age = age;
        Income = income;
    }
    
    public Person() {}
    
    public string Name { get; init; }
    public int Age { get; init; }
    public double Income { get; init; }
}

你可以使用构造函数中的: this()来实现这一点并保留参数列表,但我觉得这只会让人感到困惑。

如果你像我一样声明记录,你可以使用:

var p = new Person { Name = "Tim", Age = 40, Income = 55 };

1
谢谢!我很感激您提供的解决方案和解释。只是有点个人意见,但这不是一个设计上的缺陷吗?我本来以为“按名称”初始化应该是理所当然的,特别是因为这种机制已经存在于“with”构造函数中。 - LaloInDublin
1
嗯...我不这么认为,毕竟构造函数是初始化对象的默认方式。不过现在Dotnet是开源的,所以可以随意提出问题。 - ScottishTapWater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接