2017-04-23 2 views
2

Mit dem folgenden Code,neues Tupel zu altem Casting gibt Kompilierungsfehler

class Program 
{ 
    static void Main(string[] args) 
    { 
     Tuple<int, int> test = TupleTest(); 

    } 

    static (int, int) TupleTest() 
    { 
     return (1, 2); 
    } 

Ich bin nach dem Kompilierung Fehler.

CS0029 Fehler kann nicht implizit Typ konvertieren '(int, int)' to 'System.Tuple < int, int>'

Bedeutet es, die neue Version von Tuple ist nicht kompatibel mit der alte Version implizit? Oder mache ich hier etwas falsch?

+3

Die "neue Tupel" ist eine andere Art genannt [ 'System.ValueTuple'] (https://msdn.microsoft.com/en-us/library/system.valuetuple (v = vs.110) .aspx) (siehe [diese Frage] (http://stackoverflow.com/questions/41084411/whats-the-difference-between-system-valuetuple-and-system-tuple) für eine Diskussion der Unterschiede) und AFAIK gibt es keine Pläne, es implizit in "System.Tuple" umwandelbar zu machen. – UnholySheep

+0

Wie Matej unten beantwortet, sollten Sie die Erweiterungsmethoden ('ToTuple') verwenden. Der Grund, warum diese nicht als benutzerdefinierte Konvertierungen implementiert werden können, ist, dass sie über arity 7 hinausgehen müssen. –

Antwort

10

Ja, Sie sollten die Erweiterungsmethode ToTuple verwenden. So in Ihrem Beispiel ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     Tuple<int, int> test = TupleTest().ToTuple(); 

    } 

    static (int, int) TupleTest() 
    { 
     return (1, 2); 
    }