2012-07-11 24 views
6

Considérese este fragmento de código:¿Por qué las lambdas en C# parecen manejar los valores de retorno booleanos de manera diferente?

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
       if (a > 1) return (true); 
       else return(false); 
       }; 

En el código anterior, no puedo borrar el "otro de retorno (falsa)" declaración - el compilador advierte que no todas las rutas de código devuelven un valor. Pero en el siguiente código, que utiliza un lambda ...

Func<int, bool> TestGreaterThanOne = a => a > 1; 

no tiene que tener una declaración "si no" - no hay advertencias del compilador y la lógica funciona como se espera.

¿Qué mecanismo está en juego aquí para hacer que no tenga una declaración "else" en mi lambda?

+0

Solo para aclarar, la expresión lambda no tiene ningún manejo especial de bool específicamente. Puede escribir la versión de 'delegado' de la misma manera que lo hace Raymond Chen a continuación. La única especialidad lambda aquí es la falta de especificación de 'return' para una declaración en línea donde el valor de retorno puede inferirse (como lo hace en su ejemplo). –

Respuesta

21

Porque en su taquigrafía lambda, tampoco hay ninguna instrucción if. Su taquigrafía lambda es equivalente a

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
      return (a > 1); 
      }; 

Por lo tanto, todas las rutas de códigos devuelven un valor.

+0

ah, por supuesto. Puedo ver eso ahora. Gracias. –

2

Para agregar un poco a las otras respuestas, en su instrucción lambda, a > 1 evalúa a un booleano, que luego se devuelve.

En general, escribir return true; y return false; declaraciones se considera redundante. Es más sencillo simplemente devolver lo que evalúa la expresión.

0

No creo que manejen los valores booleanos de manera diferente en el caso que usted menciona. El código solo está haciendo dos cosas diferentes. Como define Func como Func<int, bool>, requiere un valor de retorno booleano. El segundo fragmento de código siempre devuelve un valor booleano. Sin embargo, la primera parte del código no devuelve un valor booleano a menos que incluya el else.

0

a>1 es booleano, y es por eso que su lambda funciona. casi se puede pensar en una sentencia if como una función que toma un parámetro booleano, así, se puede hacer algo como

boolean b = true 

if(b) 
    doSomething(); 

y va a compilar y ejecutar doSomething

1

Como alternativa a reescribir el delegado, eres la abstracción lambda es equivalente a

Func<int, bool> TestGreaterThanOne = a => { 
      if (a > 1) return (true); 
      else return(false); 
      }; 

donde no se puede eliminar la rama demás tampoco. Porque tampoco volvería. La versión actual funciona porque a > 1 es un valor booleano (que siempre está presente).

Cuestiones relacionadas