C#功能链接

时间:2009-11-18 18:22:00

标签: c# chaining

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

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

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

9 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

您也可以使用集合初始值设定项(假设C#3.0 +)。

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

通过280Z28编辑:这适用于任何使用Add方法的内容。构造函数括号是可选的 - 如果要将事物传递给构造函数(如容量),则可以使用List<int>(capacity)而不是上面写的List<int>来执行此操作。

以下是有关Object and Collection Initializers的详细信息的MSDN参考。

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

答案 2 :(得分: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

答案 3 :(得分:5)

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

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

答案 4 :(得分:2)

AddRange()声明为:

public void AddRange(object[]);

它不会返回列表。

答案 5 :(得分: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

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

虽然其他人已经提到过AddRange没有返回一个值,但根据为替代方案提供的样本,还应该记住,除了前面提到的代码之外,List的构造函数也将采用IE的数量。 .NET 3.5 +

例如:

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

答案 8 :(得分:0)

还有另一种方式。

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