ラムダ(int a) => a
は、int
を受け取り、int
を返すデリゲートに適合します。 Func<int,int>
は単なる例に過ぎず、delegate int Foo(int x);
で自分自身を簡単に宣言することができます。実際には、このラムダ式は、int
を受け取り、ラムダ(a
)の結果がdouble
に暗黙的に変換されるため、double
を返すデリゲートに適合します。
ラムダが適合するすべてのデリゲート型にラムダを割り当てることができるように、ラムダ自体には型がありません。代わりに、可能であれば、それを使用している代理人のタイプを取ります。 ((int a) => a
はもちろんのFunc<byte, byte>
に割り当てることができません。)
Func<int, int>
と私はそれが何をその実際は不明であるため、ラムダが直接Delegate
に変換することができない、当然の缶はDelegate
に変換され定義されたFoo
デリゲートの両方ながら署名はその後になります。 Delegate d = (int a) => a
の後、d
は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