これはよく知られているエラー メッセージです。より詳細な議論については、以下のリンクを確認してください。
http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/
基本的には、匿名デリゲート (ラムダ式) の前にキャストを配置するだけです。
リンクがダウンした場合に備えて、投稿のコピーを次に示します。
これらは匿名メソッドであり、匿名デリゲートではありません。
投稿日: 2007 年 12 月 22 日 by staceyw1
私たちは難しいことをしたいので、それは単なる話題ではありません. 正確に何が起こっているのかを理解するのに役立ちます。明確にするために、匿名デリゲートのようなものはありません。それらは存在しません (まだ)。それらは「匿名メソッド」です – ピリオド。それらをどのように考え、どのように話すかが重要です。匿名メソッド ステートメント "delegate() {…}" を見てみましょう。これは実際には 2 つの異なる操作であり、このように考えると、二度と混乱することはありません。コンパイラが最初に行うことは、推定されたデリゲート シグネチャをメソッド シグネチャとして使用して、内部で匿名メソッドを作成することです。メソッドには名前があり、コンパイラがそれを割り当てるため、メソッドが「名前なし」であると言うのは正しくありません。通常のビューから隠されているだけです。次に行うことは、メソッドをラップするために必要な型のデリゲート オブジェクトを作成することです。これはデリゲート推論と呼ばれ、この混乱の原因となる可能性があります。これが機能するためには、コンパイラは作成するデリゲート型を把握 (つまり、推測) できなければなりません。既知の具象型である必要があります。理由を確認するためにコードを書いてみましょう。
private void MyMethod()
{
}
コンパイルしません:
1) Delegate d = delegate() { }; // Cannot convert anonymous method to type ‘System.Delegate’ because it is not a delegate type
2) Delegate d2 = MyMethod; // Cannot convert method group ‘MyMethod’ to non-delegate type ‘System.Delegate’
3) Delegate d3 = (WaitCallback)MyMethod; // No overload for ‘MyMethod’ matches delegate ‘System.Threading.WaitCallback’
コンパイラはデリゲート型を推測できないため、1 行目はコンパイルされません。必要な署名を明確に確認できますが、コンパイラが確認できる具体的なデリゲート型はありません。デリゲート型の匿名型を作成できますが、そのようには機能しません。2 行目も同様の理由でコンパイルされません。コンパイラはメソッド シグネチャを認識していますが、デリゲート型を指定しておらず、たまたま機能するものを選択するだけではありません (どのような副作用が発生するかではありません)。3 行目は機能しません。これは、(WaitCallback が取り、オブジェクトとして) 異なるシグネチャを持つデリゲートとメソッドのシグネチャを意図的に一致させていないためです。
コンパイル:
4) Delegate d4 = (MethodInvoker)MyMethod; // Works because we cast to a delegate type of the same signature.
5) Delegate d5 = (Action)delegate { }; // Works for same reason as d4.
6) Action d6 = MyMethod; // Delegate inference at work here. New Action delegate is created and assigned.
対照的に、これらは機能します。行 1 が機能するのは、使用するデリゲート型をコンパイラに指示し、それらが一致するためです。5 行目も同じ理由で機能します。括弧なしで特殊な形式の「デリゲート」を使用したことに注意してください。コンパイラは、キャストからメソッド シグネチャを推測し、推測されたデリゲート型と同じシグネチャを持つ匿名メソッドを作成します。MyMethod() と Action が同じ署名を使用するため、6 行目は機能します。
これが役立つことを願っています。
参照:
http://msdn.microsoft.com/msdnmag/issues/04/05/C20/