为什么ICollection <T>没有实现ICollection?

Sam*_*ell 29 .net generics

IEnumerable<T>实施IEnumerable.
但是ICollection<T>没有实施ICollection.

这个理由是什么和/或只是一个疏忽?

Rom*_*ein 10

尼克说,ICollection几乎没用.

这些接口仅与其名称相似,CopyTo并且Count是唯一的共同属性.Add,Remove,Clear,ContainsIsReadOnly已加入的同时IsSychronized,并SyncRoot已被删除.

从本质上讲,ICollection<T>是可变的,ICollection不是.

Krzysztof Cwalina在这个主题上有更多的内容

ICollection<T>似乎ICollection,但它实际上是一个非常不同的抽象.我们发现这ICollection不是很有用.同时,我们没有表示读/写非索引集合的抽象.ICollection<T>是这样的抽象,你可以说ICollection在通用世界中没有一个完全对应的对等体; IEnumerable<T>是最接近的.

  • mutability参数不成立,因为`ICollection <T>`(mutable)实现了'IEnumerable <T>`(不可变).`ICollection <T>`通常会添加到`ICollection`的接口成员,表明它可以从它派生."ICollection <T>"中不存在的"ICollection"属性可以通过任何集合轻松实现,框架中除了"HashSet <T>"之外的所有泛型集合都是如此. (2认同)
  • @binki:在.NET 4.0之前实现`IList <Cat>`的类型可以实现`ICollection`和`IEnumerable <Animal>`,但是不会实现`IReadOnlyList <Animal>`[应该,恕我直言,已经被命名了`IReadableList <动物>`; 恕我直言,`IReadOnlyFoo`接口的合同应该指定实例可以安全地暴露给外部代码,不允许修改它们 - 这是IReadOnlyList <T>不对其实现施加的条件.让`ICollection <T>`继承自`ICollection`将确保*自.NET 2.0*以来,该代码接收... (2认同)

Sam*_*eff 6

ICollection<T>并且ICollection实际上是非常不同的接口,不幸的是共享一个名称,而不是其他.

来自http://blogs.msdn.com/b/kcwalina/archive/2005/09/23/collections.aspx

ICollection<T>似乎ICollection,但它实际上是一个非常不同的抽象.我们发现这ICollection不是很有用.同时,我们没有表示读/写非索引集合的抽象.ICollection<T>是这样的抽象,你可以说ICollection在通用世界中没有一个完全对应的对等体; IEnumerable<T>是最接近的.


Nic*_*ver 4

首先,两者都没有IList<T>实现,可能出于同样的原因。 实现:IListIList<T>ICollection<T>, IEnumerable<T>, IEnumerable

ICollection 的某些部分并不是必需的,但在它投入使用后更改界面充其量只是破坏。

看看ICollection:

public interface ICollection : IEnumerable
{
    void CopyTo(Array array, int index);

    int Count { get; }
    bool IsSynchronized { get; }
    object SyncRoot { get; }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这不是您需要的属性,当我想要一个 Collection 时,我从来没有需要过它,也不想实现它。我想这个理由已经过时了,但你必须向 .Net 团队询问肯定的答案。

  • 这个问题涉及原始的 .NET 2 设计 - 在通用接口发布之前(因此损坏不是问题)。*几乎*所有实现“ICollection&lt;T&gt;”的集合类型也实现“ICollection”(不幸的是“HashSet&lt;T&gt;”除外),并且只使用“ICollection”的“笨拙”成员的显式实现。 (3认同)