【问题标题】:F# byref param not mutableF# byref 参数不可变
【发布时间】:2016-03-15 19:13:17
【问题描述】:

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

【问题讨论】:

标签: f# overriding mutable byref


【解决方案1】:

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

这些变体将起作用(为简洁起见,省略了[&lt;Out&gt;]):

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

我完全不知道为什么大写很重要。我猜这以前从未出现过,因为按照惯例,参数总是以小写字母开头。

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

【讨论】:

  • 哇!那应该教会我不要把我的缩写大写!谢谢。
  • 如果你确实打开了一个问题,你能在这里添加参考吗?
猜你喜欢
  • 2011-06-07
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2010-10-31
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多