Desde C# 8, el lenguaje introdujo los switch expressions, una forma más concisa y expresiva de realizar asignaciones condicionales.
Pero hay una limitación importante, cada caso solo puede contener una expresión, no un bloque de varias sentencias.
Si intentás esto:
var result = value switch
{
1 =>
{
Console.WriteLine("Caso 1");
return "Uno";
},
_ => "Otro"
};
El compilador se queja: > *CS1525: Invalid expression term '{'*
Esto ocurre porque una switch expression espera una sola expresión por rama, no un bloque {}.
La pregunta es cómo resolverlo:
Opción 1: Lambda invocada inmediatamente
Si necesitás ejecutar varias líneas y devolver un resultado, podés usar una lambda expression que se ejecuta al instante:
var result = value switch
{
1 => (() =>
{
Console.WriteLine("Caso 1");
var temp = 10 * 2;
return $"Resultado: {temp}";
})(),
2 => "Dos",
_ => "Otro"
};
El truco está en (() => { ... })(): una función anónima definida y ejecutada inmediatamente.
Opción 2: Método auxiliar
Cuando el bloque es más grande o se usa varias veces, conviene delegar la lógica a un método:
var result = value switch
{
1 => CalcularCasoUno(),
2 => "Dos",
_ => "Otro"
};
string CalcularCasoUno()
{
Console.WriteLine("Caso 1");
var temp = 10 * 2;
return $"Resultado: {temp}";
}
Más limpio, legible y fácil de testear.
Los switch expressions son ideales para lógica declarativa y corta, pero cuando necesitás más pasos, la solución está en envolver el bloque dentro de una lambda o extraerlo a un método auxiliar.