¿Por qué c # no puede usar lambdas o delegados anónimos en línea? [duplicar]
Esta pregunta ya tiene una respuesta aquí:
¿Por qué se debe convertir una expresión lambda cuando se proporciona como un parámetro Delegate simple? 7 respuestasEspero haber redactado adecuadamente el título de mi pregunta.
En c # puedo usar lambdas (como delegados), o la sintaxis de delegado anterior para hacer esto:
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
Entonces, ¿por qué no puedo "en línea" el lambda o el cuerpo delegado, y evitar capturarlo en una variable con nombre (haciéndolo anónimo)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
Un ejemplo que funciona en javascript (solo para comparación) es:
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
Lo que produce el cuadro de alerta esperado.
ACTUALIZAR: Parece que túpuede tener una lambda anónima en línea en C #, si echas apropiadamente, pero la cantidad de () comienza a hacer que sea rebelde.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
¿Quizás el compilador no puede inferir el signo del delegado anónimo para saber a qué Console.WriteLine () está intentando llamar? ¿Alguien sabe por qué se requiere este yeso específico?