我需要分配一个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
?
答案 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!"
我完全不知道为何资本化很重要。我猜这种情况从未出现过,因为参数总是按照惯例以小写字母开头。
我打算再谷歌一些,然后提出问题。