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 respostas

Espero 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?

questionAnswers(4)

yourAnswerToTheQuestion