List<T>中T是否可以是匿名委托?

6

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

Action<int> method;
List<method> operations = new List<method>();
3个回答

16

例如,您可以这样编写:

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

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

如果您需要比特定委托更灵活的东西,那么请尝试查看此问题答案中定义的委托:https://dev59.com/n3M_5IYBdhLWcg3w4nfb - Matthew Scharley

3
你的代码问题在于你试图将一个实例指定为List的类型参数。
Action method是一个实例,而Action是一种类型。
正如另一个帖子所提到的,你只需要将列表的类型声明为Action,也就是只有类型参数。
例如。
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));

有些人认为这种列表推导式不应该与具有副作用的操作一起使用。像这样的 Each 方法本质上具有副作用。 - Joren
@Joren:仅仅为了副作用而使用LINQ表达式(包括理解表达式)是有问题的,因为它们的惰性特性。但是匿名方法和lambda表达式不仅仅适用于LINQ,并且没有理由限制它们在一般情况下纯粹是功能性的。因此,在我看来,使用带有List<T>.Each()的lambda是一个好的方法。 - Richard

0

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

我认为创建具有多种签名的委托列表并没有太大用处,因为未指定签名会使调用委托变得非常困难。但是,您可以使用反射来实现。在这种情况下,您可以使用对象列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接