2016-03-15 25 views
4

我需要分配給一個byref參數,但在Windows 8x64盒子上使用F#4.0和.NET 4.5.2,我總是收到我不能更改簽名的投訴,因爲我實現一個COM接口。最小破例如:F#byref param不可變

module Utils = 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : System.String byref) = ID <- "Hi!" 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : int byref) = ID <- 0 
    let bugFix1([<System.Runtime.InteropServices.Out>] ID : System.Guid byref) = ID <- System.Guid.NewGuid() 

通過this value,它肯定意味着ID,因爲它並不重要我分配到ID。還要注意,這個類型是否可以啓動,或者是堆棧還是堆棧分配都沒有關係。

有什麼辦法可以申報IDmutable

+0

也許是重複或至少類似http://stackoverflow.com/questions/946338/f-how-do-i-declare-and-use-byref-semantics-on-parameters –

+1

什麼F#版本你使用? –

+0

@FyodorSoikin好點 - 4.0。我已經編輯了這個問題。 –

回答

4

我想你已經發現了另一個bug(或者沒有記錄的特性?)。這僅僅是因爲你的參數名是大寫的。驚喜! :-)

這些變體就可以了(省略[<Out>]爲了簡潔):

let bugFix1(id : string byref) = id <- "Hi!" 
let bugFix1(iD : string byref) = iD <- "Hi!" 

但是這些將會失敗:

let bugFix1(Id : string byref) = Id <- "Hi!" 
let bugFix1(ID : string byref) = ID <- "Hi!" 

我完全不知道爲什麼會資本關係。我猜想這從來沒有出現過,因爲參數總是以小寫字母開頭。

我打算google多一些,然後提出問題。

+0

哇!這應該教會我不要大寫我的縮寫!謝謝。 –

+0

如果你確實打開了一個問題,你可以在這裏添加引用嗎? – Asik