2009-09-20 12 views
6

C#で匿名の代理人のリストを作成することはできますか?ここで私が書くのが大好きだけど、それはコンパイルできないコードは次のとおりです。Is List <T> Tは匿名の代理人が可能ですか?

Action<int> method; 
List<method> operations = new List<method>(); 

答えて

16

あなたはこれを書くことができ、例えば、

 Action<int> method = j => j++; 
     List<Action<int>> operations = new List<Action<int>>(); 

     operations.Add(method); 
     operations.Add(i => i++); 
+0

、この質問に対する回答で定義されているデリゲートを見てみた試してみてください。http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

のためにそれはのように、特定のデリゲート型の一覧を作成できることは間違いありませんアクション、Func、その他匿名の代理人は、互換性のある署名を持つ任意の代理人の型にキャストできるため、互換性のある署名がある限り、代理人の一覧を作成できます。

複数の種類のシグネチャを持つデリゲートのリストを作成することは、不特定のシグネチャを持つとデリゲートを呼び出すことが非常に困難になるため、大いに役立つと思います。あなたは反射でそうすることができるはずです。その場合は、単にオブジェクトのリストを使うことができます。

3

コードの問題は、インスタンスをListの型引数として指定しようとしていることです。

Action<int> methodがインスタンスであり、Action<int>が型です。

別のポスターに言及すると、リストのタイプをAction<int>、つまりタイプパラメータだけで宣言する必要があります。

あなたが特定のデリゲートよりも少し柔軟な何かが必要な場合は

var myNum = 5; 

var myops = new List<Action<int>>(); 
myops.Add(j => j++); 
myops.Add(j => j++); 

foreach(var method in myops) 
{ 
    Console.WriteLine(method(myNum)); 
} 

// Frowned upon, but fun syntax 

myops.Each(method => method(myNum)); 
+0

なぜそれに悩まされていますか? – recursive

+0

これらの種類のリスト内包は、副作用のある操作では使用しないでください。このような各メソッドには、本質的に副作用があります。 – Joren

+0

@ヨレン:LINQ式(理解度式を含む)を怠け者の性質のため、副作用のために使用するのは問題があります。しかし、匿名メソッドとラムダ式はLINQだけではなく、一般的に純粋に機能的であるように制限する理由はありません。ですから、IMOでは、 'List .Each()'でラムダを使うのは良いアプローチです。 – Richard

関連する問題