tutorial operador expressions expresiones c# lambda

operador - ¿Por qué una expresión lambda de C#no puede consistir en una simple sentencia if, sin necesidad de llaves?



linq lambda c# (4)

Como lo entiendo, no sería un problema implementar esto. El equipo de C # ya ha implementado funcionalidades más aterradoras (por ejemplo, LINQ)

Pero el problema es ¿dónde trazas la línea?

Si

b => if (b) DoSomething()`

está permitido, entonces, ¿por qué no debería

b => if (b) {DoSomething1(); DoSomething2();}

ser permitido. O

list => foreach (var item in list) DoSomething(item)

etc, etc, etc ... Y antes de que te des cuenta, tienes todo un equipo que admite una función básicamente trivial.

La única forma segura de no tener errores en una característica es no implementar la característica .

La implementación actual es la óptima, ya que funciona en la mayoría de los casos, y no es demasiado incómoda en el resto de ellos (un simple {} no dificulta demasiado la legibilidad, al tiempo que facilita el compilador).

Considere la siguiente expresión lambda que se asigna a un evento.

foo.BarEvent += (s, e) => if (e.Value == true) DoSomething();

Esto parece bastante sencillo y consta de una sola línea de código. Entonces, ¿por qué recibo los siguientes 2 errores del depurador?

Término de expresión no válido ''if''

Solo las declaraciones de asignación, llamada, incremento, decremento, espera y objeto nuevo se pueden usar como una declaración

Para solucionar este problema, todo lo que tiene que hacer es envolver su declaración if entre paréntesis.

foo.BarEvent += (s, e) => { if (e.Value == true) DoSomething(); }; //Errors now disappear!

Entiendo lo que están indicando estos mensajes de error. Lo que no entiendo es por qué una sola condición if declaración sería un problema para el compilador y por qué la primera asignación lambda se considera rota.

¿Podría alguien explicar el problema?


Mira esto de esta manera. Tiene una declaración condicional que dispara una línea si es correcta.

if (stuff) do stuff;

Que también se puede escribir

if (stuff) do stuff;

Como solo estás llamando a una línea de código, no necesitas dos corchetes. Si fuera más, entonces tendrías que usar corchetes.

if (stuff) { do stuff; do more stuff; }

Entonces lo estás combinando con un método anónimo, que se comporta de manera similar.

() => do stuff;

Más de una declaración, usa paréntesis al igual que el condicional.

() => {do stuff; do more stuff;}

Pero ahora los está anidando, pero aún espera poder usar el atajo. Que es realmente lo que es, un atajo que implica los corchetes para una sola declaración.

Entonces estás anidando un atajo dentro de otro atajo. C # solo lo obliga a deletrear explícitamente el acceso directo anidado.


Sin { } declaras un cuerpo de expresión, con { } es un cuerpo de declaración. Ver Lambda Expressions (Guía de programación C #) :

  • Una expression lambda devuelve el resultado de la expresión

  • Una statement lambda se asemeja a una expresión lambda, excepto que la (s) declaración (es) se incluyen entre llaves [...] El cuerpo de una declaración lambda puede constar de cualquier número de declaraciones.

Por lo tanto, si desea una declaración en lugar de una expresión, use llaves.


Ver expresiones Lambda .

Hay dos tipos de lambdas, Expresión Lambdas (no {} ) y Declaración Lambdas (con {} ).

La diferencia clave entre ellos es que la expresión Lambda se define para devolver el valor calculado por su lado derecho. Pero if() es una declaración, no una expresión. No hay un valor asociado con un if . Notará que todos los elementos de idioma "permitidos" en el mensaje de error que proporciona son expresiones : calculan un valor .