まず、コードがそのまま機能しない理由:ref
F#ではC#と同じ意味がありません。F#では、'a ref
はタイプです。contents
それも魔法ではありません-それは実際には次のように定義された単一のフィールドを持つ単なるレコードです:
type 'a ref = { mutable contents : 'a }
ローカル変数へのポインタまたは参照ではありません。したがって、これを書くとき:
let x = 0
let y = ref x
変数参照がありません。代わりに、タイプがの変数があり、の値は元の値(つまり、0)に初期化されています。あなたはそれを変えることができます:y
x
y
int ref
contents
x
y.contents <- 1
これにより、の値は変更されませんx
。の値のみを変更しますcontents
F#は、の構文糖衣も提供します'a ref
。具体的には、これ:
y.contents <- y.contents + 1
次のように短く書くことができます:
y := !y + 1
したがって:=
、はに割り当てるための省略形contents
であり!
、その値を読み取るための省略形です。
の詳細については、MSDNの参照セルref
を参照してください。
これで、F#には型に関連付けられたマジックキャストがあり、引数'a ref
を期待する外部関数にその型のインスタンスを渡すことができます( C#ではILにマップされます)。この場合、関数が引数の値を変更すると、それに応じてインスタンスのの値も変更されます。あなたの例では、の新しいインスタンスを作成し、それを変更する関数に渡してから破棄しました。あなたがすべきことはこれです:byref
ref
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)