为什么我不能使用 C#9 的 "with" 关键字来创建结构的副本(就像记录一样)

Why can't I use C#9's "with" keyword to create a copy of structs (like with records)

C#9 有一个新特性。记录类型。记录只是一个 class,但是有一堆自动创建的函数和属性。但基本上这个想法(据我所知)是,一个表现得像结构的 class,用于复制、与 Equals 的比较、不变性等。

记录类型还有一个带有关键字“with”的新功能。要创建记录的副本,您可以这样写:var copy = original with { Property = new_value, };

现在我想知道,记录是否设计得像结构一样(但 class 是)。为什么新的“with”关键字不能与结构一起使用。我的意思是,据我所知,结构具有此功能所必需的所有功能。就像它们是按值复制的。

为了对结构使用类似的功能,我必须编写一个复制构造函数,然后可以编写:var copy = new StructType(original) { Property = new_value, };

简答:

功能就是这样设计的。

长答案:

编译器使用保留名称<Clone>$创建合成克隆方法,当您使用with关键字时,编译器会调用此克隆方法,然后修改您要修改的任何属性。

structs 或 类 没有合成的克隆方法。因此,with 不能与它们一起使用。

您可能希望 write a language proposal 扩展 with 关键字的使用范围。


编辑:

目前,有一个允许 record struct 的提议。有关详细信息,请参阅 Proposal: record structs。这可能是您想要的。