Sólo expresión lambda sin cuerpo del método se puede convertir al árbol de expresión
siguientes construcciones do de compilación:
Func<int> exp1 =() => 1;
Func<int> exp2 =() => { return 1; };
Func<int> exp3 = delegate { return 1; };
Expression<Func<int>> exp4 =() => 1;
Y después de hacer no
Expression<Func<int>> exp5 = delegate { return 1; }; //no anonymous delegates
Expression<Func<int>> exp6 =() => { return 1; }; //or lambdas with block body
por lo que hay diferencia incluso en un nivel no muy avanzado (que Jon Sk eet señala aquí sick difference example)
Otra diferencia es que puede crear delegados anónimos sin lista de parámetros si no planea usarlos dentro del cuerpo del método, con lambda siempre debe proporcionar los parámetros.
dos líneas siguientes demuestran la diferencia
Func<int, int, int, int, int> anonymous = delegate { return 1; };
Func<int, int, int, int, int> lambda = (param1, param2, param3, param4) => 1;
Usted hace esencialmente lo mismo, pero en el anonimato delegado claramente se ve mejor aquí.
+1, pero no son expresiones lambda simplemente reinventando la rueda (bastante mal, ya que creo que los métodos anónimos tienen más sentido). –
por lo que la expresión lambada NO puede tener valores devueltos? mientras que el método anónimo puede? –
SnOrfus: sí, hacen lo mismo, así que tienes razón, es solo una cuestión de preferencia de sintaxis.Sasha: tanto las lambdas como los métodos anónimos pueden tener valores de retorno. –