在F#中,我有以下功能:
module ModuleName
let X (y: int -> unit) = ()
我怎样才能在C#中调用它?理想情况下它看起来像
ModuleName.X(x => x*x);
但是这个lambda语法不会隐式转换为FSharpFunc。
答案 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
静态类的静态方法之一。