1

正確なデリゲート型を知らなくても、メソッド グループ、匿名メソッド、またはラムダ式を System.Delegate にキャストする方法があるかどうかを知りたいです。

var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};

リフレクションを使用せずに、任意のパラメーターと戻り値の型を持つ任意のメソッドで機能する方法が必要です。回答ありがとうございます。

4

1 に答える 1

7

いいえ、デリゲートは単一の定義された型を持つ必要がありますが、複数のデリゲートが同じ署名を持つことができるため、それは不可能です。これにより、デリゲートの型があいまいになります。コンパイラには、そのようなステートメントで適切な型を確実に選択する方法がありません。署名が一致するが異なるタイプの委任インスタンスは交換できないことに注意してください。たとえば、次のとおりです。

i => (i % 2) == 0

Func<int,bool>またはPredicate<int>?または、他の何か?ジェネリック アートの数は無関係であることに注意してください。ActionandThreadStartおよびはすべて、MethodInvoker無効な非ジェネリック パラメーターなしのデリゲートです。

さらに、ラムダはデリゲートだけでなく式ツリーにもコンパイルできるため、複雑さ/あいまいさが追加されています。

Func<int, bool> x = i => (i % 2) == 0;
Expression<Func<int, bool>> y = i => (i % 2) == 0;

式ツリーは、デリゲートとは根本的に異なります。

于 2012-07-28T15:54:59.493 に答える