首页 > 代码库 > F#编译器的一个Bug

F#编译器的一个Bug

[<Struct>]

typeTestStruct =

    val mutable _x:int

    new(x) = {_x = x}

    member this.Set(x) = this._x <- x

member this.X with get() = this._x;

 

 

let a = TestStruct(2)

let c() =

    a.Set 10

    a.X

 

c();;

这里编译器不报错,但是执行c()的结果是2. 如果把
[<Struct>]去掉,执行结果是10,这就正确了。
结构里,
Set 函数运行没有报错,但是实在上并没有改变到_x的值。

现在我们把后面的代码改动一下,把 a 声明为 mutable:

let mutable a = TestTruct(2)

let c() =

    a.Set 10

    a.X

c();;

最后执行结果是10(正确值)。也就是说,当结构内部含有可变
值(mutable )时候,调用方如果也使用可变值(mutable ),可以得到正确结果。
但是调用方必须清楚结果内部的实现机制才行,这样就违反了结构的封装性。 


因此得出结论:
 

F#中,结构里面的成员变量不能为可变值 
mutable 虽然编译可以通得过,但是可能让调用方得不到预期的结果。