从C#调用具有函数参数的F#函数

4
在F#中,我有以下函数:

module ModuleName
let X (y: int -> unit) = ()

我该如何在C#中调用这个函数?最理想的情况下,它应该是这样的:
ModuleName.X(x => x*x);

但是这种lambda语法并不会自动转换为FSharpFunc。

2
这个有帮助吗:http://blogs.msdn.com/b/jaredpar/archive/2010/07/27/converting-system-func-lt-t1-tn-gt-to-fsharpfunc-lt-t-tresult-gt.aspx - mellamokb
2个回答

13

最简单的方法是使用标准的.NET委托类型来公开API。在这种情况下,您的F#定义应该看起来更像:

let X (y:Action<int>) = ()

但是,如果你想保持现有的F# API不变,那么你可以在C#侧使用FuncConvert.ToFSharpFunc

ModuleName.X(FuncConvert.ToFSharpFunc(x => x*x));

2
您可以使用静态的FSharpFunc.FromConverter方法来完成此操作:http://msdn.microsoft.com/en-us/library/ee353520.aspx
ModuleName.X(FSharpFunc.FromConverter(x => x*x));

编辑:我刚刚注意到你的函数要求是 int -> unit ,但您的调用指定了 int -> int 。要创建返回unit的FSharpFunc,您可以使用FuncConvert静态类的其中一种静态方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接