F#byref param不可变

时间:2016-03-15 19:13:17

标签: f# override mutable byref

我需要分配一个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

1 个答案:

答案 0 :(得分:4)

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

这些变体可以使用(为简洁省略[<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!"

我完全不知道为何资本化很重要。我猜这种情况从未出现过,因为参数总是按照惯例以小写字母开头。

我打算再谷歌一些,然后提出问题。