2011-02-25 8 views
9

Esta línea de código que intenta asignar una expresión lambda a una variable LambaExpression mecanografiado,lambda expresión de sintaxis vs clase LambdaExpression

LambdaExpression expr = n => n; 

se produce un error con el mensaje de error de compilación:

no puede convertir lambda expresión para escribir 'System.Linq.Expressions.LambdaExpression' porque no es un delegado tipo

Por lo tanto, debe ser un tipo de delegado. Conceptualmente, me parece extraño porque puedo construir una instancia LambdaExpression usando un método de fábrica como ese.

fábrica Lambda from MSDN

LambdaExpression lambdaExpr = Expression.Lambda(
    Expression.Add(
     paramExpr, 
     Expression.Constant(1) 
    ), 
    new List<ParameterExpression>() { paramExpr } 
); 

y eso no es un tipo de delegado.

Hace que nos preguntemos por qué lambda para LambaExpression no puede funcionar?

Respuesta

8

Bueno, esto hace trabajo:

Expression<Func<int, int>> exp = n => n; 
LambdaExpression lambda = exp; 

Tenga en cuenta que Expression<TDelegate> deriva de LambdaExpression.

Creo que la razón por la que no puede usar LambdaExpression como tipo es que el tipo de n (en su ejemplo) no se pudo deducir.

considerar el hecho de que también no puede hacer esto, básicamente por la misma razón:

// What is this? An Action? A ThreadStart? What? 
Delegate d =() => Console.WriteLine("Hi!"); 

Mientras que puede hace esto:

Action a =() => Console.WriteLine("Hi!"); 
Delegate d = a; 

Es esencialmente la misma cosa.

2

Porque LambdaExpression es una forma de generar expresiones lambda en tiempo de ejecución, donde n => n se convierte a una clase generada en tiempo de compilación.

En resumen: son dos cosas diferentes para hacer lo mismo, pero no se pueden usar juntas.

2

Para citar MSDN El tipo LambdaExpression representa una expresión lambda en forma de árbol de expresiones. El tipo de Expresión, que se deriva de LambdaExpression y captura el tipo de expresión lambda más explícitamente, también se puede usar para representar una expresión lambda. En tiempo de ejecución, un nodo del árbol de expresiones que representa una expresión lambda siempre es de tipo Expresión.

El valor de la propiedad NodeType de LambdaExpression es Lambda.

Utilice los métodos de fábrica de Lambda para crear un objeto LambdaExpression.

Cuestiones relacionadas