2009-09-20 25 views

回答

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 – 2009-09-20 01:18:50

0

這當然可以創建一個特定的委託類型的列表,像動作或功能,或任何其他。由於匿名委託可以轉換爲具有兼容簽名的任何委託類型,因此只要它們具有兼容的簽名,就可以創建委託列表。

我不認爲創建具有多種簽名的代表列表會有很大用處,因爲具有未指定的簽名會使調用委託非常困難。儘管如此,你應該可以通過反思來做到這一點。在這種情況下,你可以使用一個對象列表。

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 2009-09-20 01:27:46

+0

有些人認爲這些列表解析不應該用於有副作用的操作。像這樣的每種方法固有地具有副作用。 – Joren 2009-09-20 01:44:13

+0

@Joren:僅僅爲了副作用而使用LINQ表達式(包括Comprehension表達式)是有問題的,因爲它們很懶惰。但匿名方法和lambda表達式不僅適用於LINQ,並且沒有理由限制它們在一般情況下是純功能的。所以,國際海事組織(IMO)使用帶有列表.Each()的lambda表達式是一種很好的方法。 – Richard 2009-09-20 10:05:19

相關問題