2013-07-21 23 views
6

Piszę klasy interopcji F # do użycia z C#. Myślałem, że F # miał niejawna konwersja z .NET krotka <> typu (podobne do IEnumerable traktowane jako SEK), więc napisałem następujący kod:Jak przekonwertować między krotkami F # i C#?

type MyClass() = 
    member this.MyMethod (t: Tuple<int, int>) = 
     let meaningOfLife (t : int * int) = 42 
     meaningOfLife t 

Ten kod nie skompilować z powodu następującego błędu: błąd FS0001: To wyrażenie miało mieć typ int * int, ale tutaj ma typ Tuple

Następnie, jak przekonwertować krotki między C# i F # (iz powrotem)?

+0

Oba typy są różne. Możesz napisać 'meaningOfLife (t.item1, t.item2)'. – josejuan

Odpowiedz

8

Jeśli kierujesz aplikację .NET 4.0 i nowszą, nie musisz określać obiektu Tuple. F # tuple są automatycznie kompilowane do Tuple'a. Można użyć:

type MyClass() = 
    member this.MyMethod (t: int * int) = 
    let meaningOfLife (t : int * int) = 42 
    meaningOfLife t 

I powinno działać dobrze z C#.

+0

Oczywiście! To było głupie ze mnie. Dziękuję za odpowiedź. –

+0

Nadal nie rozumiem, dlaczego typowanie inferencji traktuje krotkę .NET i krotkę F #, by były inne. – colinfang