What does cause this issue?
Sieht für mich wie ein Compiler-Fehler aus. Zumindest hat es getan. Obwohl die decimal.TryParse(v, out a)
und decimal.TryParse(v, out b)
Ausdrücke dynamisch ausgewertet werden, I erwartet der Compiler noch zu verstehen, dass bis zum Erreichen a <= b
, a
und b
definitiv zugewiesen sind. Selbst mit den Seltsamkeiten, die man beim dynamischen Tippen bekommen kann, würde ich erwarten, dass man nur a <= b
nach Auswertung der beiden TryParse
Aufrufe auswerten würde.
Es stellt sich jedoch heraus, dass durch Bediener und Umwandlung heikel, es durchaus möglich ist, einen Ausdruck A && B && C
zu haben, die A
und C
aber nicht B
bewertet - wenn Sie genug sind gerissen. Siehe das Roslyn bug report für Neal Gafters geniales Beispiel.
Noch schwieriger ist es, mit dynamic
zu arbeiten - die Semantik bei dynamischen Operanden ist schwerer zu beschreiben, da zur Auswertung der Überladung Operanden ausgewertet werden müssen, um herauszufinden, um welche Typen es sich handelt kontraintuitiv. Allerdings hat Neal wieder ein Beispiel gefunden, das zeigt, dass der Compilerfehler erforderlich ist ... das ist kein Fehler, es ist ein Fehler behoben. Riesige Mengen an Lob an Neal, um es zu beweisen.
Is it possible to fix it through compiler settings?
Nein, aber es gibt Alternativen, die den Fehler vermeiden.
Erstens Sie es vor dem dynamischen stoppen könnte - wenn Sie wissen, dass Sie immer nur Strings verwenden werden, dann könnten Sie IEnumerable<string>
oder die Bereichsvariable v
eine Art string
geben (das heißt from string v in array
). Das wäre meine bevorzugte Option.
Wenn Sie wirklich Notwendigkeit, es dynamisch zu halten, nur b
Wert geben beginnen mit:
decimal a, b = 0m;
Dies wird nicht schaden - wir wissen, dass tatsächlich Ihre dynamische Auswertung gewonnen‘ t machen Sie nichts verrücktes, also werden Sie am Ende noch b
einen Wert zuweisen, bevor Sie es verwenden, so dass der Anfangswert irrelevant ist.
Außerdem scheint es, dass Klammern funktioniert auch hinzufügen:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
, dass der Punkt ändert sich bei dem verschiedene Stücke von Überladungsauflösung ausgelöst und geschieht der Compiler glücklich zu machen.
Es gibt eine Problem noch verbleibenden - die Regeln der Spezifikation auf eindeutige Zuordnung mit dem &&
Betreiber muss geklärt werden, zu erklären, dass sie nur dann Anwendung, wenn der &&
Operator mit zwei bool
Operanden in seiner „normalen“ Ausführung verwendet wird . Ich werde versuchen, sicherzustellen, dass dies für den nächsten ECMA-Standard festgelegt ist.
@BinaryWorrier: Warum? Es verwendet nur "b", nachdem es über einen "out" -Parameter zugewiesen wurde. –
[Die VS 2015-Dokumentation sagt] (https://msdn.microsoft.com/en-us/library/kx37x362.aspx) "Obwohl Variablen, die als out-Argumente übergeben werden, nicht initialisiert werden müssen, bevor sie übergeben werden, ist die aufgerufene Methode erforderlich, um einen Wert zuzuweisen, bevor die Methode zurückkehrt. " Das sieht also wie ein Fehler aus ja, es wird garantiert von diesem tryParse initialisiert. – Rup
Ja, ich bin auch überrascht. Wie ich weiß, erfordert "out" das Zuweisen einer internen Methode. Also dieser Fehler ein bisschen seltsam. – ramil89