2011-05-12 66 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

相关问题