我试图从f#调用一个c#函数,其中c#函数将一个函数(委托?)作为参数,我需要这个参数是一个f#函数。例如:
示例c#
public static void function_1(double x, ref double y)
{
y = Math.Exp(x);
}
main()
{
state s;
call_func(s, function_1)
}
因此,call_func
的参数类型为void fn(double, ref double)
在f#中我尝试过:
let function_1 (x:double) (y:double byref) =
let y = 6.0
()
let test =
let s = new state
let ret = call_func(s, function_1)
但是,如果f#function_1
应该是委托double -> double byref -> unit
的类型,我会收到f#void fn(double, ref double)
类型为{{1}}的错误。
我可以投射类型或类似的东西吗?或者有错误吗?
答案 0 :(得分:9)
如果要从F#中的函数创建委托,可以使用new
运算符并将其作为参数赋予它:
let function_1 (x:double) (y:double) =
()
Program.call_func(s, new Action<double, double>(function_1))
但是,对于some reason,如果尝试对包含ref
的委托使用相同的方法,则会出现此错误:
此函数值用于构造其签名包含byref参数的委托类型。您必须使用带有2个参数的显式lambda表达式。
因此,如果您按照错误消息提供的建议,可以编写以下内容:
let function_1 (x:double) (y:double byref) =
y <- 6.0
Program.call_func(s, new fn(fun x -> fun y -> function_1 x &y))
这会编译,并按预期工作。
请注意,要修改参数y
,您必须使用<-
运算符。使用let y = 6.0
声明完全不同的变量,该变量会影响参数。