F#中的byref参数不可变

4

我需要给一个byref参数赋值,但是在Windows 8x64框架上使用F# 4.0和.NET 4.5.2时,我不断收到“此值不可变”的投诉。由于我正在实现一个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()

通过“这个值”,它明确指的是“ID”,因为我分配给“ID”的任何内容都无关紧要。还要注意,类型是否可移植、堆或栈分配也无关紧要。
有没有一种方法声明“ID”为“mutable”?

也许是重复的或至少相似的问题 http://stackoverflow.com/questions/946338/f-how-do-i-declare-and-use-byref-semantics-on-parameters - Functional_S
1
你使用的是哪个 F# 版本? - Fyodor Soikin
@FyodorSoikin 很好的观点 - 4.0。我已经编辑了问题以包括那个。 - Jacob Manaker
1个回答

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!"

我完全不知道为什么大小写会有影响。我猜这以前从未出现过,因为按照惯例参数始终以小写字母开头。

我打算再搜索一下,然后提交一个问题。


哇!那应该教会我不要缩写大写字母了!谢谢。 - Jacob Manaker
如果您已经打开了一个问题,请在此处添加参考。 - Asik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接