【发布时间】:2009-09-20 01:10:53
【问题描述】:
是否可以在 C# 中创建匿名委托列表?这是我很想编写但无法编译的代码:
Action<int> method;
List<method> operations = new List<method>();
【问题讨论】:
标签: c# generics delegates lambda
是否可以在 C# 中创建匿名委托列表?这是我很想编写但无法编译的代码:
Action<int> method;
List<method> operations = new List<method>();
【问题讨论】:
标签: c# generics delegates lambda
你可以这样写,例如
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));
【讨论】:
List<T>.Each() 的 lambda 是一个好方法。
当然可以创建特定委托类型的列表,例如 Action 或 Func 或任何其他类型。由于匿名委托可以转换为具有兼容签名的任何委托类型,因此您可以创建委托列表,只要它们具有兼容的签名。
我认为创建具有多种签名的代表列表没有多大用处,因为具有未指定的签名会使调用代表变得非常困难。不过,您应该能够通过反射来做到这一点。在这种情况下,您可以只使用对象列表。
【讨论】: