2

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

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

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

4

9 回答 9

16

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

List<int> intrs = new List<int>();
intrs.AddRange(new int[]{1,2,3,45});
于 2009-11-18T18:23:36.307 回答
7

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

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

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

这是有关Object 和 Collection Initializers的详细信息的 MSDN 参考。

Dictionary<string, string> map = new Dictionary<string, string>()
    {
        { "a", "first" },
        { "b", "second" }
    };
于 2009-11-18T18:25:45.960 回答
6

因为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
于 2009-11-18T18:24:11.240 回答
5

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

List<int> intrs = new List<int>();
intrs.AddRange(new int[]{1,2,3,45});
于 2009-11-18T18:24:01.190 回答
2

AddRange() 声明为:

public void AddRange(object[]);

它不返回列表。

于 2009-11-18T18:24:09.910 回答
1

顺便说一句,在 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

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

于 2009-11-18T18:29:26.160 回答
0

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

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

但是,我更喜欢初始化语法。

于 2009-11-18T18:50:59.653 回答
0

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

例如:

List<int> intrs = new List<int>(new int[]{2,3,5,7});
于 2009-11-18T19:53:03.163 回答
0

还有另一种方法。

List<int> intrs =  new List<int>
                        {
                            1,
                            2,
                            3,
                            45
                        };
于 2011-04-12T19:44:47.497 回答