是否有可能在C#中創建匿名代表的列表?下面是代碼,我很想寫,但它不會編譯:是列表<T>其中T是可能的匿名代表?
Action<int> method;
List<method> operations = new List<method>();
是否有可能在C#中創建匿名代表的列表?下面是代碼,我很想寫,但它不會編譯:是列表<T>其中T是可能的匿名代表?
Action<int> method;
List<method> operations = new List<method>();
你可以這樣寫,例如
Action<int> method = j => j++;
List<Action<int>> operations = new List<Action<int>>();
operations.Add(method);
operations.Add(i => i++);
這當然可以創建一個特定的委託類型的列表,像動作或功能,或任何其他。由於匿名委託可以轉換爲具有兼容簽名的任何委託類型,因此只要它們具有兼容的簽名,就可以創建委託列表。
我不認爲創建具有多種簽名的代表列表會有很大用處,因爲具有未指定的簽名會使調用委託非常困難。儘管如此,你應該可以通過反思來做到這一點。在這種情況下,你可以使用一個對象列表。
您的代碼的問題在於您試圖將實例指定爲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));
爲什麼會皺起眉頭? – recursive 2009-09-20 01:27:46
有些人認爲這些列表解析不應該用於有副作用的操作。像這樣的每種方法固有地具有副作用。 – Joren 2009-09-20 01:44:13
@Joren:僅僅爲了副作用而使用LINQ表達式(包括Comprehension表達式)是有問題的,因爲它們很懶惰。但匿名方法和lambda表達式不僅適用於LINQ,並且沒有理由限制它們在一般情況下是純功能的。所以,國際海事組織(IMO)使用帶有列表
如果您需要比特定委託更靈活一些,請嘗試查看此問題答案中定義的委託:http://stackoverflow.com/questions/1184329/function-pointers -in-c – 2009-09-20 01:18:50