F# byref 参数不可变

F# byref param not mutable

我需要分配一个 byref 参数,但是,在 Windows 8x64 框上使用 F# 4.0 和 .NET 4.5.2,我不断收到抱怨 This value is not mutable. 我无法更改签名,因为我正在实现一个 COM 接口。最小损坏示例:

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什么并不重要。还要注意,类型是否可 blittable,或者它是堆分配还是堆栈分配都无关紧要。

有什么方法可以将 ID 声明为 mutable

我认为您发现了另一个错误(或未记录的功能?)。发生这种情况仅仅是因为您的参数名称是大写的。惊喜! :-)

这些变体将起作用(为简洁起见省略 [<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 一些然后提交问题。