我需要分配给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
什么并不重要。 另请注意,类型是否可 blitit,或者它是堆分配的还是堆栈分配的并不重要。
有没有办法将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!"
我完全不知道为什么大写很重要。我猜这以前从未出现过,因为按照惯例,参数总是以小写字母开头。
我打算再谷歌一些,然后提交一个问题。