2009-09-20 68 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

相关问题