C# 要在c库中使用的F函数:byref类型的委托
我有一个c#dll库,其中有一个方法C# 要在c库中使用的F函数:byref类型的委托,c#,.net,f#,C#,.net,F#,我有一个c#dll库,其中有一个方法g接受c#中的以下函数f,作为输入 void f(double[] x, ref double func, double[] grad, object obj) 在函数体中,更新func和grad值。f中的g(f)的输入签名为 我在g(f)上遇到错误 此函数值用于构造其签名包含byref参数的委托类型。必须使用包含4个参数的显式lambda表达式 我该怎么做才能让它工作?谢谢 更新:结果是我不得不使用g(fun(x:float[])(func:byref)
g
接受c#中的以下函数f
,作为输入
void f(double[] x, ref double func, double[] grad, object obj)
在函数体中,更新func
和grad
值。f中的g(f)
的输入签名为
我在g(f)
上遇到错误
此函数值用于构造其签名包含byref参数的委托类型。必须使用包含4个参数的显式lambda表达式
我该怎么做才能让它工作?谢谢
更新:结果是我不得不使用g(fun(x:float[])(func:byref)(grad:float[])(obj:obj)->……
。不能给内部函数起一个类似f
的名字,比如让函数1(x:double[],func:byref,grad:double[],obj:obj)=。。。
向其他.NET语言公开F#函数的一种规范方法是使用类,有时是静态类,例如LChart库()的设计:
是一个用F#编写的项目,是一个通用的.NET库。您可以看到它的公共API是如何编写的。您还可以学习如何将FSharp.Core.dll链接到dll,以便目标计算机不需要安装F#运行时
更新:
ref double func
被转换为f#作为let y=ref(func)
,double[]grad
只是f#中的float[]
。请参见以下示例了解ref
:
public class tt
{
public static void temp(int x, ref double[] y)
{
y = new double[10];
y[1] = 10;
}
}
在F#中:
请注意,
temp
的第二个参数是ref
类型。您只需使用F#中的ref
操作符为数组对象创建一个ref句柄。我在您的博客中看到,您使用system.func包装F#函数以输入ms solver dll库。我的问题可能是类似的情况。我当时正试图使用minas来自f#的alglib中的a,但对f#上下文中的API签名感到困惑。关于您的编辑,您在那里展示的函数使用curried语法,而我的函数使用tuple语法--这些是完全不同的函数签名。。。
let f(x:float[]) (func:byref<float>) (grad:float[]) (obj: obj) =
func <- ...
grad.[0] <- ...
grad.[1] <- ...
...
()
public class tt
{
public static void temp(int x, ref double[] y)
{
y = new double[10];
y[1] = 10;
}
}
let y = ref (Array.create 10 0.0)
tt.temp(0, y)
printfn "%A" y
0