Was ist die Geschichte mit ExpressionType.Assign?

c# expression-trees lambda linq

Frage

Ich hatte den Eindruck, dass eine Zuordnung innerhalb eines Lambda-Ausdrucks nicht möglich war. ZB der folgende (zugegeben nicht sehr nützliche) Code

Expression<Action<int, int>> expr = (x, y) => y = x;

Erzeugt den Compilerfehler

An expression tree may not contain an assignment operator

Und dennoch kann man laut der Dokumentation von Microsoft programmatisch einen Zuweisungsausdruck mit Expression.Assign erstellen. Wenn ich mich nicht irre, erzeugt der folgende Code einen äquivalenten Expression :

ParameterExpression xparam = Expression.Parameter(typeof(int), "x");
ParameterExpression yparam = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Assign(yparam, xparam);
var expr = Expression.Lambda<Action<int, int>>(body, xparam, yparam);
var cexpr = expr.Compile();

In diesem Fall beschwert sich der Compiler nicht. Ich habe das Gefühl, dass mir hier ein wichtiger Unterschied fehlt.

Akzeptierte Antwort

Die Antwort von usr ist korrekt; etwas erweitern:

Sie verpassen keine wichtige Unterscheidung , Sie verpassen eine wichtige Dimension : Zeit.

Wenn Sie sich die Dokumentation genau ansehen, werden Sie feststellen, dass der Assign in .NET 4.0 hinzugefügt wurde.

Zu C # 3.0, das mit .NET 3.5 geliefert wurde, wurden Ausdrucksbäume hinzugefügt.

Das Team, dem die Bibliothek der Ausdrucksbaumstruktur gehört, hat seit .NET 3.5 viele Funktionen hinzugefügt. Wenn Sie diese Features verwenden, um mehr Ausdrücke in einer Ausdrucksbaumstruktur in der C # -Sprache zuzulassen, wurde der Schnitt für C # 4.0 oder C # 5.0 nicht vorgenommen. Es gibt keinen Grund, das Feature nicht zu machen. es ist eine vollkommen sinnvolle Eigenschaft. Aber die Sprachdesigner brauchen keinen Grund, ein Feature nicht zu machen; sie benötigen einen Grund , das Budget auf ein Feature zu verbringen.

In diesem Fall haben reichere Ausdrucksbäume in C # sie auf der Prioritätenliste einfach nicht hoch genug gemacht. Wenn Sie möchten, dass diese Funktion höhere Priorität hat, können Sie ein Problem auf connect.microsoft.com öffnen und es anfordern. Ihre Anfrage wird mit größerer Wahrscheinlichkeit implementiert, wenn Sie ein überzeugendes Szenario für das Feature einfügen.


Beliebte Antwort

Du missverstehst nichts. C # ist absichtlich restriktiv in den Arten von Ausdrucksbäumen, die es für Sie generieren kann. Es gibt keinen prinzipiellen Grund, warum es diese Funktion nicht haben könnte. Es wurde einfach nicht investiert. (Das Erstellen von Features nimmt Ressourcen weg. Würden Sie lieber async/await oder Ausdrucksbaumanweisungen haben? Offensichtlich ist die erste Option nützlicher.).

Sie können auch keine anderen Anweisungen wie if oder while generieren, obwohl sie sich in der Ausdrucksbaum-API befinden, die mit .NET 4 beginnt. (Sie können jetzt komplexe Kontrollflüsse mit Ausdrucksbäumen erstellen und kompilieren).



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow