簡體   English   中英

將對象從 F# 傳遞到將其作為輸出參數的 C# 方法不起作用?

[英]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類型的變量ycontents的值被初始化為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# 中的refout映射到 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, &parameterSet)

嘗試

// let parameterSet = null;
let retval, parameterSet = currentPanel.GetParamterSet(name);

您不應將實例作為ref參數傳遞,當該方法需要一個 out 參數(在調用時應該是一個未分配的引用,前面有out關鍵字)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM