Почему c # не может использовать встроенные анонимные лямбды или делегаты? [Дубликат]
На этот вопрос уже есть ответ здесь:
Почему должно быть приведено лямбда-выражение при предоставлении в виде простого параметра Delegate 7 ответовНадеюсь, я правильно сформулировал название своего вопроса.
В c # я могу использовать лямбды (как делегаты) или более старый синтаксис делегата, чтобы сделать это:
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
Так почему же я не могу «встроить» лямбду или тело делегата и избежать записи в именованную переменную (делая ее анонимной)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
Пример, который работает в JavaScript (просто для сравнения):
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
Который производит ожидаемое окно предупреждения.
ОБНОВИТЬКажется, тыМожно иметь встроенную анонимную лямбду в C #, если вы разыгрываете соответствующим образом, но количество () начинает делать это неуправляемым.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
Возможно, компилятор не может вывести сигнал анонимного делегата, чтобы узнать, какую Console.WriteLine () вы пытаетесь вызвать? Кто-нибудь знает, почему этот конкретный актерский состав требуется?