初始化 class 实例类似于 F# 中的记录

Initializing class instance similar to records in F#

对于 F# 中的记录类型,您可以使用类似这样的语法来初始化基于另一个记录的记录:

let rr3 = { defaultRecord1 with field2 = 42 }

对于非记录类型,是否也有类似简洁优雅的东西?

我正在使用 C# classes 并调用它们的 Clone() 方法并使用 <- 运算符对其属性进行赋值似乎有点不对劲。我还找到了这篇关于 object expressions 的文章,但它似乎不是我要找的东西。

编辑:总而言之,我正在尝试在我的 F# 代码中实例化 C# classes,我想知道是否有一些简洁的语法来创建 [=24= 的对象] 基于另一个对象的值,就像 F# 中使用 with 关键字的记录一样。

您实际上可以在方法调用中使用可设置的属性,就好像它们是命名参数一样。因此,如果您的 class 是使用专用的 Clone 方法实现的,那么 returns 原始类型:

type Foo() =
    member val X = 0 with get, set
    member val Y = 0 with get, set
    member this.Clone() = new Foo(X = this.X, Y = this.Y)
    interface System.ICloneable with
        member this.Clone() = box (this.Clone())

那么您将能够执行以下操作:

let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3)

但您的 class 很可能只有 ICloneable 实现。在这种情况下,上述技巧将无法立即使用,因为 ICloneable.Clone returns obj 没有可设置的 X 属性。幸运的是,您可以添加所需的方法作为扩展:

/// Original class
type Foo() =
    member val X = 0 with get, set
    member val Y = 0 with get, set
    interface System.ICloneable with
        member this.Clone() = box (new Foo(X = this.X, Y = this.Y))

let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // error FS0039: The field, constructor or member 'Clone' is not defined
let foo3 = (foo1 :> System.ICloneable).Clone(X = 3) // error FS0495: The member or object constructor 'Clone' has no argument or settable return property 'X'. The required signature is System.ICloneable.Clone() : obj.

/// Extension that makes the above trick work
type Foo with
    member this.Clone() = (this :> System.ICloneable).Clone() :?> Foo

let foo1 = new Foo(X = 1, Y = 2)
let foo2 = foo1.Clone(X = 3) // works!