首页 > 代码库 > 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 。虽然编译可以通得过,但是可能让调用方得不到预期的结果。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。