Qual è la storia di ExpressionType.Assign?

c# expression-trees lambda linq

Domanda

Avevo l'impressione che il compito non fosse possibile all'interno di un'espressione lambda. Ad esempio, il seguente codice (certamente non molto utile)

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

Produce l'errore del compilatore

An expression tree may not contain an assignment operator

Eppure, secondo la documentazione di Microsoft , è possibile creare a livello di codice un'espressione di assegnazione utilizzando Expression.Assign . A meno che non mi sbagli, il seguente codice produce Expression equivalente:

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 questo caso, il compilatore non si lamenta. Mi sento come se mi mancasse qualche importante distinzione qui.

Risposta accettata

la risposta di usr è corretta; per espanderlo un po ':

Non ti manca un'importante distinzione , ti manca una dimensione importante: il tempo.

Se si esamina attentamente la documentazione, si noterà che il nodo Assign stato aggiunto in .NET 4.0.

Gli alberi di espressione sono stati aggiunti al C # 3.0, fornito con .NET 3.5.

Il team che possiede la libreria ad albero delle espressioni ha aggiunto molte funzioni poiché .NET 3.5 è stato spedito. L'utilizzo di tali funzionalità per consentire a più espressioni di essere in un albero di espressioni nel linguaggio C # non ha apportato il taglio per C # 4.0 o C # 5.0. Non c'è motivo di non fare la funzione; è una caratteristica perfettamente sensata. Ma i progettisti di linguaggi non hanno bisogno di un motivo per non fare una funzione; richiedono un motivo per spendere il budget per una funzionalità.

In questo caso, gli alberi di espressioni più ricchi in C # semplicemente non lo rendevano abbastanza alto nell'elenco delle priorità. Se desideri che tale funzione abbia una priorità più alta, puoi aprire un problema su connect.microsoft.com e richiederlo. È più probabile che la tua richiesta venga implementata se includi uno scenario convincente per la funzione.


Risposta popolare

Non stai fraintendendo nulla. C # è intenzionalmente restrittivo nei tipi di alberi di espressione che può generare per te. Non c'è una ragione di principio per cui non potrebbe avere quella caratteristica. Semplicemente non è stato investito in. (La creazione di feature porta via le risorse. Preferiresti avere async/await o espressioni tree tree? Chiaramente la prima opzione è più utile.).

Non è inoltre possibile generare altre istruzioni come if o while si trovano nell'API di espressione API che inizia con .NET 4. (È ora possibile costruire e compilare complessi flussi di controllo con alberi di espressioni).



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché