tutorial expressions expresiones delegados c# lambda func

expresiones - lambda expressions c#



¿Cuál es el tipo real de lambda en C#? (2)

Esto se debe a que () => 5 puede ser compatible con varios tipos de delegados (por ejemplo, puede tener un delegate personalizado que no toma nada y devuelve int ). Y para crear un delegate , el compilador debe conocer el tipo exacto. No puede simplemente elegir un tipo aleatorio que se adapte a sus necesidades. Por eso, a menos que lo conviertas en un tipo de delegado real, no puedes Invoke .

En casos como donde un método espera un delegate , esa conversión es realizada implícitamente por el compilador:

void Foo(Func<int> func) { } Foo(() => 5);

Y también es importante saber que los delegates son en realidad clases detrás de escena. Y cada vez que creas una instancia delegate , el compilador crea una instancia de esa class . Entonces, de cualquier manera, debe especificar un tipo para que el compilador sepa qué tipo usar.

Leí que C # lambdas se puede convertir de manera importante a Acción o Func, pero lambda no se puede ejecutar directamente. Defina una función lambda y ejecútela inmediatamente. Por ejemplo:

int n = (()=>5)(); //doesn''t work int n = ((Func<int>)(()=>5))(); //works

Entonces, ¿cuál es el tipo real de lambda y por qué no se puede llamar directamente? ¿Es porque el sistema de tipo C # es "más débil" que el de Haskell o Scala?


Una expresión lambda no tiene un tipo. No puede, porque cualquier tipo en el mundo .NET que pudiera tener, también codificaría el tipo de parámetros y resultados de la lambda. Ahora considera:

x => x + 1

¿Qué tipo de x podría tener? ¿De qué tipo será el resultado? No hay una sola respuesta, y la expresión lambda se puede convertir a Func<int, int> , Func<double, double> y muchos otros tipos de delegados con diferentes parámetros. Darle a una expresión lambda un tipo no permitiría tales expresiones. C # quería permitir tales expresiones, por lo que fue diseñado para no dar ningún tipo de expresiones.