2017-02-03 7 views
5

persönlich, ich weiß nur, dass dynamische nicht in Musteranpassung verwendet werden, was schade :(betrachtetWas sind die Einschränkungen der Mustervergleichsmechanik?

dynamic foo = 10; 
switch(foo) { 
    case int i: 
    break; 
} 

Auch bewertet Tupel/neo-Tupel nicht in Musterabgleich verwendet werden:

dynamic foo = (420, 360); 
switch(foo) { 
    case (int, int) i: 
    break; 
} 

Es wurde in der aktuellen Version von C# 7 entfernt und wurde für die künftige Nutzung zugewiesen.

Was die anderen Dinge sind, kann ich nicht tun?

+1

Wählen Sie dies erneut zu öffnen, da die Einschränkungen in Roslyn-Probleme dokumentiert sind und hier von jemandem, der sich die Zeit nehmen möchte, genau zusammengefasst werden können. –

+0

@DavidArno - sicher, wenn Sie dies auf Ideen beschränken möchten, die tatsächlich vorgeschlagen wurden. Aber wenn es nur fragt "Was sind die anderen Dinge, die ich nicht tun kann?", Ist das sicherlich eine unendliche Liste? –

+0

@Damien_The_Unbeliever, dann warum nicht helfen, das OP durch die Umstrukturierung der Frage, so dass es keine unendliche Liste Antwort braucht? –

Antwort

6

Das neue Muster Features in C# 7 besteht aus folgendem übereinstimmt, gefunden

  • Unterstützung für Typen-Schalt,
  • Einfache Verwendung von var Mustern,
  • Die Zugabe von when Wachen Aussagen Fall,
  • der x is T y Musterausdruck.

Ihre Beispiele konzentrieren sich auf den ersten. Und Typwechsel ist wahrscheinlich das beliebteste und am häufigsten verwendete dieser neuen Features. Während es Einschränkungen gibt, wie die, die Sie erwähnen, können andere Funktionen verwendet werden, um viele von ihnen zu umgehen.

Zum Beispiel Ihre erste Einschränkung wird durch Boxen foo-object leicht zu lösen:

dynamic foo = 10; 
switch ((object)foo) 
{ 
    case int i: 
     Console.WriteLine("int"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

int gedruckt wird, wie erwartet.

Das var-Muster und eine Wache kann um Ihre zweite Einschränkung zu arbeiten, verwendet werden:

dynamic foo = (420, 360); 
switch (foo) 
{ 
    case var ii when ii.GetType() == typeof((int, int)): 
     Console.WriteLine("(int,int)"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

(int,int) gedruckt wird.

Zusätzlich Wertetupeln können für Typ-Schalt verwendet werden, müssen Sie nur die lange Hand Syntax verwenden müssen:

var foo = (420, 360); 
switch (foo) 
{ 
    case ValueTuple<int,int> x: 
     Console.WriteLine($"({x.Item1},{x.Item2})"); 
     break; 
    default: 
     Console.WriteLine("other"); 
     break; 
} 

Die oben (420,360) gedruckt wird.

Für mich persönlich die größte Beschränkung auf Pattern-Matching in C# 7 das Fehlen Muster passenden Ausdrücke mit dem match Schlüsselwort.Ursprünglich wurde das folgende für dieses Release geplant, war aber pulled due to time constraints:

var x = 1; 
var y = x match (
    case int _ : "int", 
    case * : "other" 
); 

Das um mit switch gearbeitet werden kann, aber es ist chaotisch:

var x = 1; 
var y = IntOrOther(x); 

... 

private string IntOrOther(int i) 
{ 
    switch (i) 
    { 
     case int _ : return "int"; 
     default: return "other"; 
    } 
} 

Aber Hilfe naht hier mit zahlreichen 3rd-Party pattern-Matching-Bibliotheken, wie meine eigene Succinc<T> library, die wir an, Sie schreiben Sie es als:

var x = 1; 
var y = x.TypeMatch().To<string>() 
     .Caseof<int>().Do("int") 
     .Else("other") 
     .Result(); 

es ist nicht so gut, wie die 0 mitSchlüsselwort, aber es ist eine optionale Problemumgehung, bis diese Funktion in einer späteren Sprachversion erscheint.

Um die Einschränkungen von C# 7 wirklich zu verstehen, lohnt es sich, auf die pattern matching spec on GitHub Bezug zu nehmen und diese mit dem zu vergleichen, was in der nächsten Version von C# sein wird. Betrachtet man es jedoch, wird deutlich, dass es für all diese Probleme gibt.

Diese Frage wurde ursprünglich geschlossen, da sie wie derzeit formuliert offen ist. Um ein paar alberne Beispiele zu geben, sind die Beschränkungen des Musterabgleichs von C# 7, dass es Sie nicht zu einer perfekten Tasse Kaffee macht oder Sie in Sekundenschnelle um die Welt fliegen lässt ... aber ich beantworte lieber den Geist der Frage. Und die Antwort ist wirklich, dass die einzige Einschränkung Ihre Vorstellungskraft ist. Wenn Sie sich dadurch nicht einschränken lassen, müssen Sie berücksichtigen, dass die Workarounds Lesbarkeit und/oder Auswirkungen auf die Leistung haben. Sie sind wahrscheinlich die einzigen Einschränkungen der realen Welt.

+0

Sie können den Match-Ausdruck fälschen, indem Sie den Schalter in ein Lambda setzen https://gist.github.com/bradphelan/350da3554ca8db3f0fa90ee598dabe58 – bradgonesurfing

+0

@bradgonesurfing, fühlen Sie sich frei - wenn Sie möchten - um meine Antwort zu bearbeiten, um das einzuschließen, anstatt nur es als Kommentar haben. –

Verwandte Themen