List <t>其中T是匿名委托吗?</t>

时间:2009-09-20 01:10:53

标签: c# generics delegates lambda

是否可以在C#中创建匿名委托列表?这是我想写的代码,但它没有编译:

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

3 个答案:

答案 0 :(得分:16)

你可以写这个,例如

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

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

答案 1 :(得分:3)

您的代码的问题在于您尝试将实例指定为List的类型参数。

Action<int> method是一个实例,而Action<int>是一种类型。

正如另一张海报所提到的,你只需要将列表类型声明为Action<int>,即只使用类型参数。

e.g。

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));

答案 2 :(得分:0)

当然可以创建特定委托类型的列表,例如Action或Func,或其他任何类型。由于匿名委托可以转换为具有兼容签名的任何委托类型,因此只要具有兼容签名,就可以创建委托列表。

我不认为创建具有多种签名的委托列表会有很大用处,因为具有未指定的签名会使调用委托变得非常困难。不过,你应该可以用反射来做到这一点。在这种情况下,您只需使用对象列表。