2009-10-26 65 views
24

申報觀點以下是允許固定大小列出

IList<string> list= new string[3]; 
    list.Add("Apple"); 
    list.Add("Manago"); 
    list.Add("Grapes"); 

1) 它編譯罰款,但運行時我收到"Collection was of fixed size"錯誤。 當然,集合的大小是動態增長的,爲什麼這樣的聲明被編譯器接受?

2)我可以分配給IList的不同列表是什麼? 例

IList<string> fruits=new List<string>(); 

在這裏,我分配清單IList中,有哪些不同的集合 類我可以分配到的IList?

回答

41

這裏的根本問題是System.Array通過實施IList<T>違反了置換原則。 A System.Array類型具有不可更改的固定大小。 IList<T>上的Add方法旨在爲底層集合添加一個新元素,並將其大小增加1.這對於System.Array不可行,因此它會拋出。

什麼System.Array真的想在這裏實現是隻讀樣式IList<T>。不幸的是,在框架中不存在這樣的類型,因此它實現了下一個最好的東西:IList<T>

至於什麼類型可分配到IList<T>的問題,其實有不少包括:ReadOnlyCollection<T>Collection<T>。該列表太長而無法放入。看到這一切的最好方法是在反射器中打開IList<T>並查找IList<T>的派生類型。

+0

詞典實現ICollection ,而不是IList thecoop 2009-10-26 15:04:34

+0

@thecoop,良好的捕獲,更新 – JaredPar 2009-10-26 15:09:50

6

當你調用list.Add時,你試圖插入一個項目到你的數組的末尾。數組是一個固定大小的集合,所以你不能做一個Add。相反,你將不得不通過索引分配的條目:

list[0] = "a"; 
list[1] = "b"; 
list[2] = "c"; 
2

@Jake:實際上一個字符串[]可以施放給IList ......但是你不能添加到它。

如果你想預填充的列表中,那麼你可能使用類似:

IList<string> list= new string[3] { "Apple", "Mango", "Grapes" }; 

但後來什麼使得一個IList的地步?你仍然無法添加到它。如果它確實是一個固定大小的列表,則將其設置爲一個字符串[]。否則,按照Jake的建議,將其設爲List()。