Mam nadzieję, że poprawnie sformułowałem tytuł mojego pytania.Dlaczego nie można używać wbudowanych anonimowych obiektów lambdas lub delegatów?
w C# można używać lambdy (delegatów), lub starszej delegata składni Aby to zrobić:
Func<string> fnHello =() => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
Więc dlaczego nie mogę „inline” lambda lub organ delegat i uniknąć przechwytywania to w nazwie zmiennej (czyniąc ją anonimową)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
Przykładem, który działa w JavaScript (tylko dla porównania) jest:
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
która produkuje oczekiwany powiadomienie pudełko.
UPDATE: Wydaje się może mają inline anonimowy lambda w C#, jeśli rzucisz odpowiednio, ale ilość startów() 's, aby go niesforny.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous lambda"))()
);
Może kompilator nie można wywnioskować sig z anonimowego delegata wiedzieć, które Console.WriteLine() starasz się nazywają? Czy ktoś wie, dlaczego ta konkretna obsada jest wymagana?
Rozważ to: 'public static R Eval (Func m) {return m();}'. Możesz wtedy powiedzieć 'Eval (() => {return" test ";})' który jest trochę ładniejszy, lub nawet 'Eval (() => {return" test ";})'. –
Ben