Лямбда как (int a) => a
подходит любому делегату, который принимает int
и возвращает int
. Func<int,int>
- это всего лишь один пример, и вы можете легко объявить его самостоятельно с помощью delegate int Foo(int x);
. Фактически это выражение лямбда будет даже соответствовать делегату, который принимает int
и возвращает double
, потому что результат лямбда (a
) неявно конвертируется в double
.
Для того, чтобы лямбда была назначена всем типам делегатов, которые она поместила бы, сама лямбда не имеет своего типа. Вместо этого он принимает тип делегата, который вы его используете, до тех пор, пока это возможно. ((int a) => a
не может быть отнесен к Func<byte, byte>
конечно.)
Хотя как Func<int, int>
и Foo
делегата я определила, конечно, может быть преобразована в Delegate
, лямбда не может быть трансформирован в Delegate
, потому что неясно, что его фактическое подпись будет тогда. После Delegate d = (int a) => a
будет d
be Foo
, или Func<int, int>
, или даже Func<int, double>
? Все это действительные возможности, и компилятор понятия не имеет, что вы намеревались. Это может сделать наилучшее предположение, но C# - это не тот язык, который делает такие догадки. Вот почему вы не можете сделать что-то вроде var = (int a) => a
.
я думаю, что сообщение об ошибке, что компилятор дает для Delegate d = (int a) => a;
очень неясно:
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Наглядно вы думаете Delegate
является типом делегата, но это не так, как вещи работают. :)
Fyi. Всякий раз, когда что-то не удается скомпилировать, прочитайте (и опубликуйте) сообщение об ошибке. –
@SharePoint Новичок: см. Мой обновленный пост. Это должно решить вашу ошибку сейчас. – Noldorin