Element lambda podobny do (int a) => a
będzie pasował do każdego delegata, który pobiera int
i zwraca wartość int
. Func<int,int>
to tylko jeden przykład i można go łatwo zadeklarować za pomocą delegate int Foo(int x);
. W rzeczywistości to wyrażenie lambda będzie nawet pasować do delegata, który pobiera int
i zwraca double
, ponieważ wynik lambda (a
) jest domyślnie wymienialny na double
.
Aby lambda mogła być przypisana do wszystkich typów uczestników, do których byłaby dopasowana, sama lambda z natury nie posiada typu. Zamiast tego przyjmuje typ delegata, którego używasz, o ile jest to możliwe. ((int a) => a
nie może być przypisana do Func<byte, byte>
oczywiście).
Chociaż zarówno Func<int, int>
i Foo
pełnomocnika I określonych oczywiście może być przekształcony Delegate
, lambda nie może być przetwarzany bezpośrednio do Delegate
, ponieważ nie wiadomo, co jej rzeczywisty podpis byłby wtedy. Po Delegate d = (int a) => a
, będzie d
być Foo
lub Func<int, int>
, a nawet Func<int, double>
? Wszystkie są poprawnymi możliwościami, a kompilator nie ma pojęcia, co zamierzałeś. Mogłoby to najlepiej zgadywać, ale C# nie jest językiem, który robi takie zgadywanie. Właśnie dlatego nie możesz zrobić czegoś takiego jak var = (int a) => a
.
uważam, że komunikat o błędzie, że kompilator daje za Delegate d = (int a) => a;
jest bardzo jasne:
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Intuicyjnie można by pomyśleć Delegate
to typ delegata, ale to nie jak to wszystko działa. :)
Fyi, Ilekroć coś nie uda się skompilować, przeczytaj (i opublikuj) komunikat o błędzie. –
@SharePoint Newbie: Zobacz mój zaktualizowany post. To powinno rozwiązać twój błąd. – Noldorin