Al almacenar un lambda como delegado, está almacenando una instancia específica de un delegado que realiza alguna acción. No se puede modificar, solo lo llamas. Una vez que tenga a su delegado, tiene opciones limitadas para inspeccionar lo que hace y lo que no.
Al almacenar una lambda como expresión, está almacenando un árbol de expresiones que representa al delegado. Puede ser manipulado para hacer otras cosas como cambiar sus parámetros, cambiar el cuerpo y hacer que haga algo radicalmente diferente. Incluso podría compilarse de nuevo a un delegado para que pueda llamarlo si lo desea. Puede inspeccionar fácilmente la expresión para ver cuáles son sus parámetros, qué hace y cómo lo hace. Esto es algo que un proveedor de consultas puede usar para comprender y traducir una expresión a otro idioma (como escribir una consulta SQL para un árbol de expresiones correspondiente).
También es mucho más fácil crear un delegado dinámicamente utilizando expresiones de las que emite el código. Puede pensar en su código en un nivel superior como expresiones que es muy similar a cómo un compilador ve el código en lugar de ir a bajo nivel y ver el código como instrucciones IL.
Así que con una expresión, usted es capaz de hacer mucho más que un simple delegado anónimo. Aunque no es realmente gratis, el rendimiento tendrá éxito si ejecuta expresiones compiladas en comparación con un método regular o un delegado anónimo. Pero eso podría no ser un problema ya que los otros beneficios de usar expresiones pueden ser importantes para usted.
Esto lo aclaró perfectamente para mí, muchas gracias :-) – Steffen