是否有可能在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