首先,为什么您的代码不能按原样运行:ref
在 F# 中的含义与在 C# 中的含义不同。在 F# 中,'a ref
是一个类型。它也不是神奇的——它实际上只是一个包含单个字段的记录contents
,定义如下:
type 'a ref = { mutable contents : 'a }
它不是对局部变量的指针或引用。因此,当您编写此代码时:
let x = 0
let y = ref x
你没有变量y
引用x
。相反,您有y
type的变量int ref
,其值contents
初始化为具有的值x
(即 0)。你可以改变它:
y.contents <- 1
这不会改变 的值x
。它只会改变contents
F# 还为'a ref
. 具体来说,这个:
y.contents <- y.contents + 1
可以更短的写成:
y := !y + 1
因此:=
是分配给的简写contents
,并且!
是读取其值的简写。
有关. _ _ref
现在 F# 有一个与'a ref
类型关联的魔法转换,它允许您将该类型的实例传递给需要byref
参数的外部函数(在 C# 中ref
和在 IL中都out
映射到)。byref
在这种情况下,如果函数更改了参数的值,则实例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)