¿Es posible tener un interruptor en una expresión lambda? Si no, ¿por qué? Resharper lo muestra como un error.C# interruptor en la expresión lambda
Respuesta
Puede lambda en un bloque de instrucciones:
Action<int> action = x =>
{
switch(x)
{
case 0: Console.WriteLine("0"); break;
default: Console.WriteLine("Not 0"); break;
}
};
Pero no se puede hacer en una "expresión lambda única", por lo que este no es válida:
// This won't work
Expression<Func<int, int>> action = x =>
switch(x)
{
case 0: return 0;
default: return x + 1;
};
Esto significa que puede No uso el modificador en un árbol de expresiones (al menos como lo genera el compilador de C#; creo que .NET 4.0 al menos tiene soporte para él en las bibliotecas).
sí parece que el problema es que quiero un árbol de expresiones. ¿Hay algún trabajo mejor que un if si un functino? – Toto
Una pequeña corrección (en retrospectiva ... ¿cuánto es bueno en retrospectiva :-)). El compilador de C# 4.0 aún no puede construir 'expresiones' complejas (con 'if',' while' ...) pero puedes construirlas mediante el uso de la clase 'Expression'. Las dos cosas están desacopladas.Y con menos retrospectiva: el OP preguntó acerca de los árboles de expresión. La segunda 'acción' debería haber sido una' Expresión
@xanatos: Gracias, he editado. –
Hmm, no veo ninguna razón por la que esto no debería funcionar. Solo tenga cuidado con la sintaxis que usa
param => {
// Nearly any code!
}
delegate (param) {
// Nearly any code!
}
param => JustASingleExpression (No switches)
Sí, funciona, pero debe poner su código en un bloque. Ejemplo:
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
Luego, para lo llaman:
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
he comprobado también :-)
[Test]
public void SwitchInLambda()
{
TakeALambda(i => {
switch (i)
{
case 2:
return "Smurf";
default:
return "Gnurf";
}
});
}
public void TakeALambda(Func<int, string> func)
{
System.Diagnostics.Debug.WriteLine(func(2));
}
funciona bien (salidas "Pitufo")!
Porque eso no es una expresión de Lambda. A ** Lambda Expression ** sería del tipo 'Expression
En una pura Expression
(en .NET 3.5), el más cercano que puedes conseguir es un compuesto condicional:
Expression<Func<int, string>> func = x =>
x == 1 ? "abc" : (
x == 2 ? "def" : (
x == 3 ? "ghi" :
"jkl")); /// yes, this is ugly as sin...
No es divertido, especialmente cuando se pone compleja. Si se refiere a una expresión lambda con un cuerpo de la declaración (sólo para uso con LINQ a Objetos), entonces cualquier cosa es legal dentro de las llaves:
Func<int, string> func = x => {
switch (x){
case 1: return "abc";
case 2: return "def";
case 3: return "ghi";
default: return "jkl";
}
};
Por supuesto, es posible que pueda subcontratar el trabajo; por ejemplo, LINQ a SQL permite asignar una UDF escalar (en la base de datos) a un método en el contexto de datos (que no se utiliza en realidad) - por ejemplo:
var qry = from cust in ctx.Customers
select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };
donde es MapType
un UDF que hace el trabajo en el servidor de db.
Puede omitir los paréntesis en su primer código; el resultado es * mucho * menos feo y en realidad lo uso a veces. Es cierto que lleva un tiempo acostumbrarse, pero no es intrínsecamente menos legible que un bloque de 'interruptor' equivalente (menos, diría yo). –
Sin los soportes a veces me pierdo? /: etc ... pero sí, puede funcionar sin ellos ;-p –
@MarcGravell ¿Todavía no hay nada mejor para una 'Expresión' pura en .Net 4.0? – ken2k
- 1. Expresión lambda en C#
- 2. C#: ¿Sin conversión implícita entre 'expresión lambda' y 'expresión lambda'?
- 3. C# Velocidad de expresión lambda
- 4. Sintaxis de la expresión Lambda
- 5. Expresión lambda en Powershell
- 6. Lambda Expresión vs Functor en C++
- 7. Expresión Lambda versus Statement Lambda
- 8. Expresión Lambda
- 9. Cómo filtrar una lista en C# con la expresión lambda?
- 10. Reemplazar parámetro en la expresión lambda
- 11. C# lambda expresión dirección inversa <=
- 12. std :: transformar utilizando C++ 0x expresión lambda
- 13. "auto" en la expresión lambda pitón
- 14. OrdenarPor descendente en la expresión Lambda?
- 15. Cómo "dejar" en expresión lambda?
- 16. Cómo iniciar rosca con la expresión lambda C#
- 17. IComparer utilizando Lambda Expresión
- 18. ¿Qué significa "Expresión Lambda"?
- 19. lambda Expresión como propiedad
- 20. Cómo funciona Lambda Expresión
- 21. expresión lambda utilizando Foreach Cláusula
- 22. expresión lambda (MSVC++ vs g ++)
- 23. Almacenar una expresión Lambda en una variable
- 24. Reemplazar parámetros en una expresión lambda
- 25. Expresión dentro de la declaración de la caja del interruptor
- 26. Entrevista: ¿Qué es la expresión lambda?
- 27. LINQ to SQL: reutilizar la expresión lambda
- 28. MVC 3: HTML.DisplayFor y la expresión Lambda
- 29. Construir dinámicamente la expresión de Linq Lambda
- 30. expresión lambda porque dentro de la lista
¿Compila? No usaría Resharper como palabra final sobre la sintaxis válida. –
Claro que no y el error compilado es el mismo que el resultado mostrado por el reafilado: una expresión lambda con una instrucción boody no se puede convertir a un árbol de expresiones. – Toto
NB: No sé lo que es un cuerpo de declaración. – Toto