首页 > 解决方案 > 为什么我不能使用 C#9 的“with”关键字来创建结构的副本(如使用记录)

问题描述

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

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

现在我想知道,如果记录被设计为表现得像结构(但是是类)。为什么新的“with”关键字也不适用于结构。我的意思是,据我所知,结构具有此功能所必需的所有功能。就像它们是按价值复制的一样。

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

标签: structrecordc#-9.0

解决方案


简短的回答:

这就是该功能的设计方式。

长答案:

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

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

你可能想写一个语言提案来扩展with关键字的使用。


编辑:

目前,有一个允许record structs 的提议。有关更多信息,请参阅提案:记录结构。这可能是您想要的。


推荐阅读