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

时间:2012-03-28 19:41:45

标签: c# f#

在F#中,我有以下功能:

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

我怎样才能在C#中调用它?理想情况下它看起来像

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

但是这个lambda语法不会隐式转换为FSharpFunc。

2 个答案:

答案 0 :(得分:13)

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

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

但是,如果您希望保持F#API与当前相同,那么您可以使用C#端的FuncConvert.ToFSharpFunc

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

答案 1 :(得分:2)

您应该可以使用静态FSharpFunc.FromConverter方法执行此操作:http://msdn.microsoft.com/en-us/library/ee353520.aspx

ModuleName.X(FSharpFunc.FromConverter(x => x*x));

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