2016-03-15 24 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