with表达式仅支持record类型及显式实现IEquatable且字段全为init/只读的类型;普通class不支持,即使字段设为readonly或init;其创建的是浅拷贝,嵌套引用类型需手动用with更新。
with表达式只能用于record和不可变类型
不是所有类都能用 with,只有 record(含 record struct)或显式实现 IEquatable 且字段全为 init 或只读的类型才支持。普通 class 即使字段都设为 readonly 或 init,也不行——编译器不认。
常见错误:CS8957: 'with' expression cannot be applied to type 'MyClass',说明类型没被识别为可 with 的 record。
- 必须用
record关键字声明,例如:record Person(string Name, int Age); - 继承自另一个 record 的子 record 默认也支持
with - 如果用了
record class并手动加了构造函数或属性 setter,要确保所有字段/属性仍通过init初始化
with 创建的是浅拷贝,嵌套 record 需手动处理
with 表达式默认只复制顶层字段,对引用类型字段(比如另一个 record、List、string)不做深拷贝。这意味着修改嵌套对象会影响原实例。
示例: