2012-03-28 5 views
4

In F # hat habe ich die Funktion:Anruf F # Funktion, die einen Funktionsparameter von C#

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

Wie kann ich das nenne in C#? Idealerweise würde es wie folgt aussehen:

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

Aber diese Lambda-Syntax konvertiert nicht implizit in eine FSharpFunc.

+2

Ist diese Hilfe: 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

Antwort

11

Der einfachste Ansatz besteht darin, Ihre API mit Standard-.NET-Delegattypen verfügbar zu machen. In diesem Fall bedeutet das, dass Ihr F # Definition aussehen soll mehr:

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

Wenn Sie jedoch Ihr F # API das gleiche behalten wollen, wie es derzeit ist, dann könnte man FuncConvert.ToFSharpFunc von der C# Seite verwenden:

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

sollten Sie in der Lage sein, dies mit der statischen FSharpFunc.FromConverter Methode zu tun: http://msdn.microsoft.com/en-us/library/ee353520.aspx

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

EDIT: Ich habe gerade bemerkt, dass Ihre Funktion für ein int -> unit ruft aber Ihr Anruf gibt ein int -> int. Um eine FSharpFunc zu erstellen, die unit zurückgibt, können Sie eine der statischen Methoden der statischen Klasseverwenden.