Aufzählungen in Lambda-Ausdrücken werden unterschiedlich kompiliert. Folge von Überlastungsauflösungsverbesserungen?

68

Beim Ausprobieren von Visual Studio 2015 RC wurde ein Laufzeitfehler für zuvor funktionierenden Code angezeigt. Angesichts des Lambda (x => x.CustomerStatusID == CustomerStatuses.Active), das an eine Funktion als übergeben wurde Expression<>, zeigt der Debugger einen Unterschied im Ausdrucksbaum. Früher wurde es so zusammengestellt:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == 0
}

Aber in C # 6.0 wird es jetzt als kompiliert

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}

Obwohl die Korrektur meines Code zum Durchlaufen von Bäumen unkompliziert war und das zusätzliche Detail geschätzt wird, kennt jemand andere Fallstricke, die so herumschwirren?

Hat jemand einen Link zu Informationen darüber, wie die Überlastungsauflösung verbessert wurde? Ich kann keine finden.

Ron Newcomb
quelle
1
Was war der Laufzeitausnahmetyp und die Meldung?
Erik Philips
6
Sie sollten Ihre Frage aktualisieren, heißt es in Ihrem ersten Satz I received a run-time error on previously working code.
Erik Philips
2
Dies ist nur ein Problem mit dem Wert 0 der Aufzählung, richtig? Ich vermute, es hat damit zu tun, dass der Compiler eine Art Optimierung mit dem Standardwert durchführt, was für Ausdrucksbäume eigentlich nicht hätte tun sollen und als Fehler angesehen wurde.
Mike Zboray
1
Xanatos ist richtig. Ohne unsere defensiven Codierungspraktiken hätten wir möglicherweise irgendwann ein gewöhnliches NullRef oder schlimmer noch, lautlos falsche Ergebnisse erhalten. Ich mache mir Sorgen, dass ich keine Literatur zu dieser C # 6.0-Änderung finden kann, da der neue syntatische Zucker und die Feature-Adds das Rampenlicht stehlen. Alles, was ich jemals über die Überlastungsänderung gesehen habe, ist eine vage Erwähnung von Nullables, aber ohne Beispiele. Daher frage ich die Community.
Ron Newcomb
8
Sie sollten dies auf github.com/dotnet/roslyn/issues posten / fragen, wenn Sie dies noch nicht getan haben.
JoshVarty

Antworten:

4

Dies hat nichts mit Überlastungsauflösung zu tun. Der vorherige Compiler hat die rechte Seite des Vergleichs vorzeitig optimiert, wodurch der dem Quellausdruck entsprechende Code weggelassen wurde.

Neal Gafter
quelle