使用带有f#函数的c#委托

b1g*_*ar5 6 f# c#-to-f#

我试图从f#调用ac#函数,其中c#函数将一个函数(委托?)作为参数,我需要这个参数为af #function.例如:

样本c#

public static void function_1(double x, ref double y)
{
    y = Math.Exp(x);
}

main()
{ 
    state s;
    call_func(s, function_1)
}
Run Code Online (Sandbox Code Playgroud)

所以,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)
Run Code Online (Sandbox Code Playgroud)

但是,当它应该是委托的function_1类型double -> double byref -> unit时,我得到f#具有类型的错误void fn(double, ref double).

我可以投射类型或类似的东西吗?还是有错误?

svi*_*ick 9

如果要从F#中的函数创建委托,可以使用new运算符并将其作为参数赋予它:

let function_1 (x:double) (y:double) = 
    ()

Program.call_func(s, new Action<double, double>(function_1))
Run Code Online (Sandbox Code Playgroud)

但是,出于某种原因,如果尝试对包含的委托使用相同的方法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))
Run Code Online (Sandbox Code Playgroud)

这编译,并按预期工作.

请注意,要修改参数y,必须使用<-运算符.使用let y = 6.0声明完全不同的变量来遮蔽参数.