2011-05-12 46 views
2

爲什麼IListICollection的通用對應方不具有相同的一組方法和屬性有什麼特別的原因嗎?他們似乎把他們移動了。爲什麼IList和ICollection的通用副本不具有相同的方法集?

Ex。 IList<T>

int IndexOf(T item); 
void Insert(int index, T item); 
void RemoveAt(int index); 
T this[int index] { get; set; } 

IList

int Add(object value); 
void Clear(); 
bool Contains(object value); 
int IndexOf(object value); 
void Insert(int index, object value); 
void Remove(object value); 
void RemoveAt(int index); 
bool IsFixedSize { get; } 
bool IsReadOnly { get; } 
object this[int index] { get; set; } 

回答

0

IList<T>實現ICollection<T>,在IList<T>不要緊哪個接口擁有什麼樣的背景下這樣至少。至於爲什麼,誰知道那個瘋狂的.NET團隊心中發生了什麼。然而,「集合」需要添加,刪除,檢查其內容等方法似乎是合乎邏輯的。只要這些方法不在索引「列表」的上下文中。一旦您開始在概念上討論列表,您需要添加索引,這需要索引器本身以及索引敏感的方法來添加,刪除和檢查元素。

+1

我完全同意你的看法,ICollection應該有所有這些方法。奇怪的是,只有通用版本纔有。 – Magnus 2011-05-12 19:25:22

+0

@Magnus:'ICollection '包括應該出現在非泛型'ICollection'和'IList'之間的類型的功能。相反,在「ICollection 」和「IEnumerable 」之間,應該有一種類似於非通用ICollection 的類型,但不能添加項目。當泛型和非泛型事物如此不同時,使用相同的名稱「ICollection」會令人困惑;減輕混淆的最好方法是忽略匹配的名稱。 – supercat 2014-02-11 07:25:48

0

我認爲主要的設計決定歸根結底是.Net中的數組實際上都隱含地實現了IList<T>IList中的許多方法(如RemoveClear)不適用於數組,因此它們被移至不同的接口。

+0

數組也實現了非泛型'IList' – Magnus 2011-05-12 19:19:52

+0

'IList '中還有一個Add方法,它由Array「執行」。 – 2013-01-14 16:29:33

相關問題