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.