如何用可变字段和不可变字段初始化结构?

时间:2014-05-24 18:14:26

标签: f# c#-to-f#

到目前为止我读过的所有结构的例子都是当所有字段都是可变的或者所有字段都是不可变的时。因此,编译很好:

[<Struct>]
type Number(x:int) =
    member this.X = x

这样做:

[<Struct>]
type Number =
    val mutable X:int
    new(x) = {X = x}

但是,我不知道如何编写一个具有一个字段可变且一个不可变的结构的显式构造函数:

[<Struct>]
type Numbers(x:int) =
    member this.X = x
    val mutable Y:int
    new(x,y) = ???

显式构造函数必须清楚地调用隐式构造函数。到目前为止,我尝试过的所有天真的解决方案都失败了。

后续问题:解决方案,无论是什么,都将字段Y分配一次或两次(首先使用默认值)?

1 个答案:

答案 0 :(得分:3)

第二个示例中使用的显式构造语法适用于所有结构,无论它们是否具有可变字段。

我们也可以重写第一个使用该语法的示例,尽管它看起来不太好看。还有一个技术差异,member this.X定义了一个属性,而val X定义了一个字段。

在第三种情况下,你要写下这个:

[<Struct>]
type Numbers =
    val X : int
    val mutable Y : int
    new(x, y) = { X = x; Y = y }

这只会明确指定Y一次。