相关疑难解决方法(0)

为什么带有byref的函数不能直接转换为委托?

在正常情况下,可以通过调用new DelegateType函数并将函数作为参数传递,将F#函数转换为委托.但是当委托包含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)
Run Code Online (Sandbox Code Playgroud)

不会编译,给出以下错误:

此函数值用于构造其签名包含byref参数的委托类型.您必须使用带有1个参数的显式lambda表达式.

出现错误后,修改要使用的代码

let d = new ActionByRef<_>(fun x -> f(&x))
Run Code Online (Sandbox Code Playgroud)

作品.但我的问题是:为什么这有必要?为什么F#不允许从命名函数转换到此委托,但是从lambda转换是好的?

在研究另一个问题时,我发现了这种行为.我意识到byref只是为了与其他.Net语言兼容.

f# delegates ref byref

6
推荐指数
1
解决办法
913
查看次数

标签 统计

byref ×1

delegates ×1

f# ×1

ref ×1