首先,为什么您的代码不能按原样运行:ref 在 F# 中的含义与在 C# 中的含义不同。在 F# 中,'a ref 是一个类型。它也不是什么神奇的东西——它实际上只是一个包含单个字段contents 的记录,定义如下:
type 'a ref = { mutable contents : 'a }
它不是指向局部变量的指针或引用。因此,当你写这个时:
let x = 0
let y = ref x
你没有变量y引用x。相反,您有int ref 类型的变量y,contents 的值初始化为x 的值(即0)。你可以改变它:
y.contents <- 1
这不会改变x 的值。它只会改变contents的值
F# 还为'a ref 提供了一些语法糖。具体来说:
y.contents <- y.contents + 1
可以写成:
y := !y + 1
因此:= 是赋值给contents 的简写,! 是读取其值的简写。
有关 ref 的更多信息,请参阅 MSDN 中的 Reference Cells。
现在 F# 有一个与 'a ref 类型关联的魔术转换,它允许您将该类型的实例传递给一个外部函数,该函数需要一个 byref 参数(C# 中的 ref 和 out 都映射到 @ 987654347@ 在伊利诺伊州)。在这种情况下,如果函数改变了参数的值,contents 在你的ref 实例中的值也会相应地改变。在您的示例中,ref parameterSet 创建了一个 ref 的新实例,将其传递给更改它的函数,然后将其丢弃。你应该做的是:
let parameterSet = ref(new ParameterSet())
let retVal = currentPanel.GetParameterSet(name, parameterSet)
...
// use parameterSet.contents as needed
或者,您可以使用let mutable 声明一个可变局部变量,然后使用神奇的& 运算符将其作为byref 直接传递给函数:
let mutable parameterSet = new ParameterSet()
let retVal = currentPanel.GetParameterSet(name, ¶meterSet)