F # Rätsel: wie eine Überlastung eines Verfahrens nennen?
Frage
Erster Teil: Aufruf F # von F #
Lassen Sie uns sagen, dass wir die folgende Art haben in F # definiert:
type MyClass =
static member Overload1 (x, y) = "Pim"
static member Overload1 (x : System.Tuple<_, _>) = "Pam"
static member Overload1 x = "Pum"
Sie befinden sich nun in einem anderen Modul (in einer anderen Datei).
Wie kann man jede der drei Methoden aufrufen oben gezeigt?
Zweiter Teil: Aufruf C # von F #
Jetzt definieren Sie eine Klasse in C #:
public class MyClass {
public static string Overload1<a, b>(a x, b y) { return "Pim"; }
public static string Overload1<a, b>(Tuple<a, b> x) { return "Pam"; }
public static string Overload1<a>(a x) { return "Pum"; }
}
Von einem F # -Code, wie kann man jede der drei Methoden aufrufen, definiert nun in C #?
Lösung
Hier ist eine Antwort auf den F # Teil:
MyClass.Overload1(1,2)
MyClass.Overload1<_,_>(unbox (box (1,2)) : System.Tuple<int,int>)
MyClass.Overload1 1
Andere Tipps
Hmm, ich bin nicht klar, ob es möglich ist, die F # „Pam“ Methode aufzurufen. Aber hier ist der Rest.
C #:
using System;
namespace CSharp
{
public class MyClass
{
public static string Overload1<a, b>(a x, b y) { return "Pim"; }
public static string Overload1<a, b>(Tuple<a, b> x) { return "Pam"; }
public static string Overload1<a>(a x) { return "Pum"; }
}
}
F #:
namespace FSharp
type MyClass =
static member Overload1 (x, y) = "Pim"
static member Overload1 (x : System.Tuple<_, _>) = "Pam"
static member Overload1 x = "Pum"
namespace DoIt
module Examples =
let CallFSharp() =
printfn "%s" <| FSharp.MyClass.Overload1(1,2) // Pim
printfn "%s" <| FSharp.MyClass.Overload1((1,2)) // Pum!
printfn "%s" <| FSharp.MyClass.Overload1(()) // Pum
let CallCSharp() =
printfn "%s" <| CSharp.MyClass.Overload1(1,2) // Pim
printfn "%s" <| CSharp.MyClass.Overload1<int,int>((1,2)) // Pam
printfn "%s" <| CSharp.MyClass.Overload1(()) // Pum
do
CallFSharp()
CallCSharp()
Natürlich in der Praxis wird es selten Methoden in IL zu sehen, dass take System.Tuple<...>
Objekte als Parameter.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow