Por que o c # não pode usar lambdas anônimas inline ou delegados? [duplicado]
Esta pergunta já tem uma resposta aqui:
Por que uma expressão lambda deve ser convertida quando fornecida como um parâmetro Delegate simples 7 respostasEspero ter redigido o título da minha pergunta adequadamente.
No c #, posso usar lambdas (como delegados) ou a sintaxe de delegado mais antiga para fazer isso:
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
Então, por que não posso "alinhar" o lambda ou o corpo do delegado e evitar capturá-lo em uma variável nomeada (tornando-o anônimo)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
Um exemplo que funciona em javascript (apenas para comparação) é:
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
O que produz a caixa de alerta esperada.
ATUALIZAR: Parece que vocêpode tenha uma lambda anônima in-line em C #, se você converter adequadamente, mas a quantidade de () começará a tornar-se irregular.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
Talvez o compilador não consiga inferir o sig do delegado anônimo para saber para qual Console.WriteLine () você está tentando chamar? Alguém sabe por que esse elenco específico é necessário?