C# 要在c库中使用的F函数:byref类型的委托

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)

我有一个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)(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