在正常情况下,F# 函数可以通过调用new DelegateType
并作为参数传入函数来转换为委托。但是当委托包含byref
参数时,这是不可能的。例如代码:
type ActionByRef<'a> = delegate of 'a byref -> unit
let f (x:double byref) =
x <- 6.0
let x = ref 42.0
let d = new ActionByRef<_>(f)
无法编译,出现以下错误:
此函数值用于构造其签名包含 byref 参数的委托类型。您必须使用带有 1 个参数的显式 lambda 表达式。
出现错误后,修改代码以使用
let d = new ActionByRef<_>(fun x -> f(&x))
作品。但我的问题是:为什么这是必要的?为什么 F# 不允许从命名函数转换到此委托,但从 lambda 转换没问题?
我在研究另一个问题时遇到了这种行为。我意识到byref
这只是为了与其他 .Net 语言兼容。