2009-11-18 138 views
2

爲什麼我在下面的聲明中收到錯誤?C#函數鏈接

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

錯誤:無法將void類型轉換爲List?

+9

因爲AddRange不返回列表。 – 2009-11-18 18:25:33

回答

16

因爲AddRange函數沒有返回值。您可能需要分兩步執行此操作:

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

AddRange不會返回已添加項的列表(不像StringBuilder)。你需要做這樣的事情:

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

的AddRange()被聲明爲:

public void AddRange(object[]); 

它不返回列表。

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 
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" } 
    }; 
+0

是的,我正在使用C#3.0.Thanks。 – udana 2009-11-18 18:28:15

+0

但構造函數沒有聲明???它是合成糖嗎? – udana 2009-11-18 18:31:56

+0

它是語法糖 - 請參閱http://msdn.microsoft.com/en-us/library/bb384062.aspx – thecoop 2009-11-18 19:33:43

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 

除了其他的答案,你可以添加自己的擴展方法,將增加範圍和回報名單(不是這是一個好的做法)。

0

順便說一句,如果你已經宣佈intrs,你可能會用括號做了它:

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

不過,我喜歡的初始化語法更好。

0

雖然其他人已經提到AddRange沒有返回值,但是基於給出的替代方案的樣本,還應該記住List的構造函數除了前面提到的代碼之外還將接受T的IEnumerable是.NET 3。5+

例如:

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

還有另一種方式。

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

是的,我知道這與方法鏈不完全相關。 – 2011-04-12 19:57:39