【问题标题】:C# Function ChainingC# 函数链接
【发布时间】:2009-11-18 18:22:00
【问题描述】:

为什么我在以下声明中收到错误?

List<int> intrs = new List<int>().AddRange(new int[]{1,2,3,45});

错误:无法将类型 void 转换为 List ?

【问题讨论】:

  • 因为 AddRange 不返回 List

标签: c# chaining


【解决方案1】:

因为AddRange 函数没有返回值。您可能需要分两步执行此操作:

List<int> intrs = new List<int>();
intrs.AddRange(new int[]{1,2,3,45});

【讨论】:

    【解决方案2】:

    您还可以使用集合初始化程序(假设 C# 3.0+)。

    List<int> intrs = new List<int> { 1, 2, 3, 45 };
    

    由 280Z28 编辑:这适用于任何使用 Add 方法的东西。构造函数括号是可选的 - 如果您想将事物传递给构造函数,例如容量,您可以使用 List&lt;int&gt;(capacity) 而不是上面写的 List&lt;int&gt;

    这里是 MSDN 参考,了解有关 Object and Collection Initializers 的详细信息。

    Dictionary<string, string> map = new Dictionary<string, string>()
        {
            { "a", "first" },
            { "b", "second" }
        };
    

    【讨论】:

    【解决方案3】:

    因为AddRange 修改了指定的列表,而不是返回包含添加项的新列表。为了表明这一点,它返回void

    试试这个:

    List<int> intrs = new List<int>();
    intrs.AddRange(new int[]{1,2,3,45});
    

    如果你想在不修改原列表的情况下新建一个列表,可以使用LINQ

    List<int> intrs = new List<int>();
    List<int> newIntrs = intrs.Union(new int[]{1,2,3,45}).ToList();
    // intrs is unchanged
    

    【讨论】:

      【解决方案4】:

      AddRange 不会返回已添加项目的列表(与 StringBuilder 不同)。你需要做这样的事情:

      List<int> intrs = new List<int>();
      intrs.AddRange(new int[]{1,2,3,45});
      

      【讨论】:

        【解决方案5】:

        AddRange() 声明为:

        public void AddRange(object[]);
        

        它不返回列表。

        【讨论】:

          【解决方案6】:

          顺便说一句,在 C# 3.x(不确定 2.0)中,您可以执行以下任一操作

          List<int> intrs = new List<int>{1,2,3,45};
          List<int> intrs = new []{1,2,3,45}.ToList(); // with Linq extensions
          

          除了其他答案之外,您还可以添加自己的扩展方法来添加范围和返回列表(这并不是一个好习惯)。

          【讨论】:

            【解决方案7】:

            顺便说一句,如果你已经声明了 intrs,你可以用括号来做:

            (intrs = new List<int>()).AddRange(new int[] { 1, 2, 3, 45 });
            

            不过,我更喜欢初始化语法。

            【讨论】:

              【解决方案8】:

              虽然其他人已经提到 AddRange 不返回值,但根据为替代方案提供的示例,还应该记住,除了前面提到的代码之外,List 的构造函数还将采用 T 的 IEnumerable .NET 3.5+

              例如:

              List<int> intrs = new List<int>(new int[]{2,3,5,7});
              

              【讨论】:

                【解决方案9】:

                还有另一种方法。

                List<int> intrs =  new List<int>
                                        {
                                            1,
                                            2,
                                            3,
                                            45
                                        };
                

                【讨论】:

                • 是的,我知道这与方法链并不完全相关。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-12-01
                相关资源
                最近更新 更多