我可以使用 C# 9 记录 "with" 表达式复制并添加到新的派生实例吗?

Using C# 9 records "with" expression can I copy and add to new derived instance?

假设我有以下内容:

public record Settings 
{
  public int Setting1 { get; init; }
}

public record MoreSettings : Settings
{
  public string Setting2 { get; init; }
}
...

var settings = new Settings { Setting1 = 1 };

// This is an error - CS0117
MoreSettings moreSettings = settings with { Setting2 = "A string setting" };

有没有一种干净的方法可以实现这一点?我的语法有误吗?
显然,在这种人为的情况下,我可以手动复制每个碱基 属性.

var moreSettings = new MoreSettings { Setting1 = settings.Setting1, Setting2 = "A String!" };

但是如果基本记录类型有很多属性呢?

根据你原来的问题,

MoreSettings moreSettings = settings with { Setting2 = "A string setting" };

with 关键字在内部确保在更改指定属性之前调用该类型的复制构造函数。在示例中,Settings 记录没有名为 Settings2 的 属性,这就是不允许这样做的原因。

关于你的第二种方法,如果基础 class 有很多属性,你可以为 MoreSettings 记录引入一个额外的构造函数,它接受 Settings 的实例作为 解决方法 不必像 OP 中给出的第二个示例那样添加每个属性。

相反,你可以,

public record MoreSettings : Settings
{
   public MoreSettings(Settings parent) : base(parent) { }
   public string Setting2 { get; init; }
}

现在您可以拨打电话

MoreSettings moreSettings = new MoreSettings(settings) { Setting2 = "A string setting" };

您还可以通过使用 Target-Type C# 9 中的新表达式

删除右侧的 MoreSettings
MoreSettings moreSettings = new (settings)  { Setting2 = "A string setting" };