【问题标题】:Is List<T> where T is an anonymous delegate possible?List<T> 是否可以在其中 T 是匿名委托?
【发布时间】:2009-09-20 01:10:53
【问题描述】:

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

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

【问题讨论】:

    标签: c# generics delegates lambda


    【解决方案1】:

    你可以这样写,例如

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

    【讨论】:

    【解决方案2】:

    您的代码的问题是您试图将一个实例指定为 List 的类型参数。

    Action&lt;int&gt; method 是一个实例,而Action&lt;int&gt; 是一个类型。

    正如另一张海报提到的,您只需将列表的类型声明为Action&lt;int&gt;,即仅使用类型参数即可。

    例如

    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:将 LINQ 表达式(包括理解表达式)用于副作用是有问题的,因为它们具有惰性。但匿名方法和 lambda 表达式不仅适用于 LINQ,而且一般没有理由将它们限制为纯函数式。因此,IMO,使用带有 List&lt;T&gt;.Each() 的 lambda 是一个好方法。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多