为什么我不能使用 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。这可能是您想要的。
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。这可能是您想要的。