C # 7 Wert Tupel / Dekonstruktion Asymmetrie

8

Geige hier .

Mit einer Funktion (string a, string b) F() können Sie das zurückgegebene Tupel dekonstruieren:

%Vor%

Oder Sie können es einfach zuweisen:

%Vor%

Dekonstruktoren von Klassen verhalten sich wie der erste Fall. Gegeben eine Klasse C mit Deconstructor(out string a, out string b) :

%Vor%

Aber der Compiler verwendet den Dekonstruktor nicht, um ihn implizit in ein Tupel umzuwandeln:

%Vor%

Offensichtlich können Sie eine implizite Konvertierung basierend auf dem Dekonstruktor schreiben:

%Vor%

Trotz der visuellen Ähnlichkeit in der Syntax zwischen den Dekonstruktions- und Zuweisungsfällen ist das Zuweisen eines Verweises zu einem Tupel nicht dasselbe wie das Dekonstruieren einer Klasse in Variablen und das anschließende Einfügen in ein neues Tupel. Sie können jedoch (int x, int y) implizit in (double x, double y) konvertieren. Wertetupel sind die Art von syntaktischem Zucker, bei der es so funktioniert, wie es aussieht, und die Implementierungsdetails nicht zu beachten sind.

Wenn ich darüber nachdachte, dachte das C # -Team darüber nach, und wenn sie keine "magische" Unterstützung für die implizite Konvertierung hinzufügten, hatten sie einen guten Grund 1 .

Gibt es einen positiven Grund, warum die implizite Konvertierung automatisch eine schlechte Idee wäre?

Oder ist es eines dieser Merkmale, die nicht als wertvoll genug angesehen wurden, um die Kosten zu rechtfertigen?

Hier ist der Code von dieser Geige :

%Vor%

1 Das C # Team ist vielleicht nicht schlauer als alle anderen, aber ich habe nie Geld verloren, indem ich wette, dass sie mindestens so schlau sind wie ich.

    
Ed Plunkett 11.05.2017, 16:06
quelle

3 Antworten

5
___ qstnhdr ___ C # 7 Wert Tupel / Dekonstruktion Asymmetrie ___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ answer43920667 ___

%code% deklariert eine einzelne Variable des Tupeltyps %code% named %code% . Auf diese Weise können Sie %code% oder %code% schreiben, aber nicht %code% oder %code% .

%code% versucht, einen nicht verwandten %code% -Typ in diesen Tupeltyp zu konvertieren. Wenn du keine Besetzung schreibst, gibt es keine Möglichkeit dafür.

Insbesondere ermöglicht die Destrukturierung, wie der Name schon sagt, die Zuweisung zu Variablen. Sie können nicht in einen nicht verwandten Typ konvertieren.

    
___ answer44878622 ___

Hier ist eine Möglichkeit, um das zu erreichen, was Sie zu tun versuchen: Verwenden Sie in Ihrem Codebeispiel %code% anstelle von %code% .

Sie können auch eine benutzerdefinierte Konvertierung von Ihrem Typ in den benötigten Tupeltyp schreiben.

    
___ qstntxt ___

Geige hier .

Mit einer Funktion %code% können Sie das zurückgegebene Tupel dekonstruieren:

%Vor%

Oder Sie können es einfach zuweisen:

%Vor%

Dekonstruktoren von Klassen verhalten sich wie der erste Fall. Gegeben eine Klasse %code% mit %code% :

%Vor%

Aber der Compiler verwendet den Dekonstruktor nicht, um ihn implizit in ein Tupel umzuwandeln:

%Vor%

Offensichtlich können Sie eine implizite Konvertierung basierend auf dem Dekonstruktor schreiben:

%Vor%

Trotz der visuellen Ähnlichkeit in der Syntax zwischen den Dekonstruktions- und Zuweisungsfällen ist das Zuweisen eines Verweises zu einem Tupel nicht dasselbe wie das Dekonstruieren einer Klasse in Variablen und das anschließende Einfügen in ein neues Tupel. Sie können jedoch %code% implizit in %code% konvertieren. Wertetupel sind die Art von syntaktischem Zucker, bei der es so funktioniert, wie es aussieht, und die Implementierungsdetails nicht zu beachten sind.

Wenn ich darüber nachdachte, dachte das C # -Team darüber nach, und wenn sie keine "magische" Unterstützung für die implizite Konvertierung hinzufügten, hatten sie einen guten Grund 1 .

Gibt es einen positiven Grund, warum die implizite Konvertierung automatisch eine schlechte Idee wäre?

Oder ist es eines dieser Merkmale, die nicht als wertvoll genug angesehen wurden, um die Kosten zu rechtfertigen?

Hier ist der Code von dieser Geige :

%Vor%

1 Das C # Team ist vielleicht nicht schlauer als alle anderen, aber ich habe nie Geld verloren, indem ich wette, dass sie mindestens so schlau sind wie ich.

    
___ antwort43932061 ___

Die Fähigkeit, Dekonstruktionen wie implizite Umwandler zu haben, wurde von mir (vor allem von mir, damit ich hier voreingenommen bin) verlangt, bevor C # 7 veröffentlicht wurde. Die Antwort des Teams war (wie ich es trotzdem gelesen habe), dass es zu nahe an der C # 7-Version war und zu lange gebraucht hätte, um es zu implementieren. Da es jetzt eine bahnbrechende Veränderung wäre, ist es nicht etwas, das jemals passieren wird.

Bitte beachten Sie den " Dekonstruktion zulassen und impliziter Operator sowohl die Dekonstruktion als auch die Konvertierung in Tupeltypen unterstützen " Roslyn Repo Thema für die aktuelle Diskussion zu diesem Thema.

    
___ tag123c70 ___ Die Versionen von C #, die im Jahr 2017 veröffentlicht wurden und Value-Tupel, lokale Funktionen, grundlegende Mustervergleiche, ref locals und returns, async main und verschiedene andere neue Funktionen hinzufügen. ___ tag123valuetuple ___ hilf uns, dieses Wiki zu bearbeiten ___
David Arno 12.05.2017, 07:39
quelle
5

(string a, string b) ab deklariert eine einzelne Variable des Tupeltyps (string a, string b) named ab . Auf diese Weise können Sie ab.a oder ab.b schreiben, aber nicht a oder b .

(string a, string b) f = c; versucht, einen nicht verwandten C -Typ in diesen Tupeltyp zu konvertieren. Wenn du keine Besetzung schreibst, gibt es keine Möglichkeit dafür.

Insbesondere ermöglicht die Destrukturierung, wie der Name schon sagt, die Zuweisung zu Variablen. Sie können nicht in einen nicht verwandten Typ konvertieren.

    
SLaks 11.05.2017 16:10
quelle
3

Hier ist eine Möglichkeit, um das zu erreichen, was Sie zu tun versuchen: Verwenden Sie in Ihrem Codebeispiel (string a, string b) f = c; anstelle von (string a, string b) f = (_, _) = c; .

Sie können auch eine benutzerdefinierte Konvertierung von Ihrem Typ in den benötigten Tupeltyp schreiben.

    
Julien Couvreur 03.07.2017 05:55
quelle

Tags und Links