【发布时间】:2009-11-18 18:22:00
【问题描述】:
为什么我在以下声明中收到错误?
List<int> intrs = new List<int>().AddRange(new int[]{1,2,3,45});
错误:无法将类型 void 转换为 List ?
【问题讨论】:
-
因为 AddRange 不返回 List
。
为什么我在以下声明中收到错误?
List<int> intrs = new List<int>().AddRange(new int[]{1,2,3,45});
错误:无法将类型 void 转换为 List ?
【问题讨论】:
因为AddRange 函数没有返回值。您可能需要分两步执行此操作:
List<int> intrs = new List<int>();
intrs.AddRange(new int[]{1,2,3,45});
【讨论】:
您还可以使用集合初始化程序(假设 C# 3.0+)。
List<int> intrs = new List<int> { 1, 2, 3, 45 };
由 280Z28 编辑:这适用于任何使用 Add 方法的东西。构造函数括号是可选的 - 如果您想将事物传递给构造函数,例如容量,您可以使用 List<int>(capacity) 而不是上面写的 List<int>。
这里是 MSDN 参考,了解有关 Object and Collection Initializers 的详细信息。
Dictionary<string, string> map = new Dictionary<string, string>()
{
{ "a", "first" },
{ "b", "second" }
};
【讨论】:
AddRange 不会返回已添加项目的列表(与 StringBuilder 不同)。你需要做这样的事情:
List<int> intrs = new List<int>();
intrs.AddRange(new int[]{1,2,3,45});
【讨论】:
AddRange() 声明为:
public void AddRange(object[]);
它不返回列表。
【讨论】:
顺便说一句,在 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
除了其他答案之外,您还可以添加自己的扩展方法来添加范围和返回列表(这并不是一个好习惯)。
【讨论】:
顺便说一句,如果你已经声明了 intrs,你可以用括号来做:
(intrs = new List<int>()).AddRange(new int[] { 1, 2, 3, 45 });
不过,我更喜欢初始化语法。
【讨论】:
虽然其他人已经提到 AddRange 不返回值,但根据为替代方案提供的示例,还应该记住,除了前面提到的代码之外,List 的构造函数还将采用 T 的 IEnumerable .NET 3.5+
例如:
List<int> intrs = new List<int>(new int[]{2,3,5,7});
【讨论】:
还有另一种方法。
List<int> intrs = new List<int>
{
1,
2,
3,
45
};
【讨论】: