[英]Passing an object from F# into a C# method which takes it as an out parameter doesn't work?
我正在使用的庫之一在 C# 中定義了這一點:
public ushort GetParameterSet(string name, out ParameterSet parameterSet)
我正在嘗試從 F# 調用它:
let parameterSet = new ParameterSet();
let retVal = currentPanel.GetParameterSet(name, ref parameterSet);
但是,即使在 C# 方法中將 parameterSet 設置為具有有效數據的該類的實例,它在 F# 中也不會更改。
我在這里缺少什么?
首先,為什么您的代碼不能按原樣工作: ref
在 F# 中的含義與在 C# 中的含義不同。 在 F# 中, 'a ref
是一種類型。 它也不是神奇的 - 它實際上只是一個具有單個字段contents
的記錄,定義如下:
type 'a ref = { mutable contents : 'a }
它不是指向局部變量的指針或引用。 因此,當你寫這個時:
let x = 0
let y = ref x
您沒有引用x
變量y
。 相反,您有一個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 中的 參考單元。
現在 F# 有一個與'a ref
類型相關聯的魔術轉換,它允許您將該類型的實例傳遞給需要byref
參數的外部函數(C# 中的ref
和out
映射到 IL 中的byref
)。 在這種情況下,如果函數更改了參數的值,則ref
實例中contents
的值也會相應更改。 在您的示例中, 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)
嘗試
// let parameterSet = null;
let retval, parameterSet = currentPanel.GetParamterSet(name);
您不應將實例作為ref
參數傳遞,當該方法需要一個 out 參數(在調用時應該是一個未分配的引用,前面有out
關鍵字)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.