[<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 。虽然编译可以通得过,但是可能让调用方得不到预期的结果。
F#编译器的一个Bug
时间: 2024-10-29 19:07:52