¿Cuál es la historia con ExpressionType.Assign?

c# expression-trees lambda linq

Pregunta

Tenía la impresión de que la asignación no era posible dentro de una expresión lambda. Por ejemplo, el siguiente código (ciertamente no muy útil)

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

Produce el error del compilador

An expression tree may not contain an assignment operator

Y, sin embargo, según la documentación de Microsoft , uno puede crear mediante programación una expresión de asignación utilizando Expression.Assign . A menos que me equivoque, el siguiente código produce una 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();

En este caso, el compilador no se queja. Siento que me falta alguna distinción importante aquí.

Respuesta aceptada

La respuesta de usr es correcta; para ampliarlo de alguna manera:

No te estás perdiendo una distinción importante, te estás perdiendo una dimensión importante: el tiempo.

Si observa detenidamente la documentación, observará que el nodo Assign se agregó en .NET 4.0.

Los árboles de expresión se agregaron a C # 3.0, que se envió con .NET 3.5.

El equipo que posee la biblioteca del árbol de expresiones le ha agregado muchas características desde que se entregó .NET 3.5. El uso de esas características para permitir que más expresiones estén en un árbol de expresiones en el lenguaje C # no hizo el corte para C # 4.0 o C # 5.0. No hay razón para no hacer la función; Es una característica perfectamente sensible. Pero los diseñadores de idiomas no requieren una razón para no hacer una función; requieren una razón para gastar el presupuesto en una función.

En este caso, los árboles de expresiones más ricos en C # simplemente no lo hicieron lo suficientemente alto en la lista de prioridades. Si desea que esa función tenga una prioridad más alta, puede abrir un problema en connect.microsoft.com y solicitarlo. Es más probable que su solicitud se implemente si incluye un escenario convincente para la característica.


Respuesta popular

No estás malinterpretando nada. C # es intencionalmente restrictivo en los tipos de árboles de expresión que puede generar para usted. No hay ninguna razón por la que no pueda tener esa característica. Simplemente no se invirtió en. (La creación de funciones quita recursos. ¿Prefiere tener async/await o expresiones del árbol de expresiones? Claramente, la primera opción es más útil).

Tampoco puede generar otras declaraciones como if o while aunque están en la API del árbol de expresiones que comienza con .NET 4. (Ahora puede construir y compilar flujos de control complejos con árboles de expresiones).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow