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 一些然后提交问题。
我需要分配一个 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 一些然后提交问题。