.net 为什么';t i收集<;T>;实现ICollection?

.net 为什么';t i收集<;T>;实现ICollection?,.net,generics,.net,Generics,IEnumerable实现IEnumerable 但是ICollection没有实现ICollection 这是什么原因和/或只是疏忽?首先,IList也没有实施IList,可能是出于同样的原因IList实现:ICollection,IEnumerable,IEnumerable ICollection的某些部分是不必要的,但在界面出现后更改界面最多也就是中断 查看ICollection: public interface ICollection : IEnumerable { void

IEnumerable
实现
IEnumerable

但是
ICollection
没有实现
ICollection

这是什么原因和/或只是疏忽?

首先,
IList
也没有实施
IList
,可能是出于同样的原因<代码>IList实现:
ICollection,IEnumerable,IEnumerable

ICollection的某些部分是不必要的,但在界面出现后更改界面最多也就是中断

查看ICollection:

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

    int Count { get; }
    bool IsSynchronized { get; }
    object SyncRoot { get; }
}

在大多数情况下,这不是您需要的属性,当我想要一个集合时,我从来没有需要过它,也不想实现它。我想这是一个老生常谈的理由,但你必须向.Net团队寻求肯定的答案。

正如尼克所说,
ICollection
几乎毫无用处

这些接口仅在名称上相似,
CopyTo
Count
是唯一的共同属性<已添加代码>添加,
删除
清除
包含
仅读
,同时已删除
IsSychronized
同步根

本质上,
ICollection
是可变的,
ICollection
不是可变的

有更多关于这个的

ICollection
看起来像是
ICollection
,但实际上它是一个非常不同的抽象。我们发现,
ICollection
不是很有用。同时,我们没有表示读/写非索引集合的抽象
ICollection
就是这样一种抽象,你可以说,
ICollection
在泛型世界中没有一个精确对应的对等体<代码>IEnumerable是最接近的


ICollection
ICollection
都至少包含一个返回集合类型(
GetEnumerator
)的方法和另一个将其作为参数(
CopyTo
)的方法

ICollection.GetEnumerator
ICollection.GetEnumerator
是协变的,因为
T
是比
System.Object
更具体的类型。这部分没问题。这就是为什么
IEnumerable
能够为
IEnumerable
子类化(从而可以替换)的原因

但是,如果我们希望
ICollection
可以替代
ICollection
,我们还需要
ICollection.CopyTo
ICollection.CopyTo
相反,而事实并非如此。
ICollection.CopyTo
方法不能接受比
T
更少特定类型的参数(泛型语法将其限制为
T
或更小)。如果
ICollection.CopyTo
方法在其参数中不是逆变的,那么这意味着
ICollection
接口作为一个整体不可替代
ICollection

这可能有点难以理解;它更复杂,因为它处理数组。在
IList
中这一点非常明显,实现这两个接口可能会破坏泛型应该保证的类型安全性(只需调用非泛型
IList.Add
方法)。但这实际上只是另一种说法,
IList.Add
方法的参数与
IList.Add
的参数不是相反的-泛型方法不能接受不太具体的类型
System.Object
作为参数

长话短说:
ICollection
在任何情况下都不能替代
ICollection
,因此不能从中继承。

ICollection
ICollection
实际上是非常不同的接口,不幸的是它们共享一个名称,而没有太多其他名称

ICollection
看起来像是
ICollection
,但实际上它是一个非常不同的抽象。我们发现,
ICollection
不是很有用。同时,我们没有表示读/写非索引集合的抽象
ICollection
就是这样一种抽象,你可以说,
ICollection
在泛型世界中没有一个精确对应的对等体<代码>IEnumerable是最接近的


这个问题是指原始的.NET2设计——在通用接口发布之前(所以破坏不是问题)。几乎所有实现
ICollection
的集合类型都实现了
ICollection
(不幸的是
HashSet
除外),并且只使用
ICollection
@280Z28的“笨拙”成员的显式实现-如果他们要将
ICollection
更改为不需要这些属性,这就是我的意思……他们只是选择了
ICollection
来不需要它们,更简单且不破坏。关于差异的争论站不住脚,因为
ICollection
不是强类型容器。您可以用它来表示
ICollection
不能从
ICollection
派生,但是您可以始终在强类型集合周围放置一个弱包装器,当不正确使用时,底层实现可能会抛出
ArgumentException
。实现
ICollection
的集合确实有一个
Count
属性,它可以逐个元素复制到
object[]
类型的数组(根据需要装箱),这意味着它可以安全地实现
ICollection
@280Z28:您的“强类型集合的弱包装器”在这里不相关,因为泛型是关于编译时类型安全的,而弱包装器必须依赖于运行时类型检查。为了使
ICollection
ICollection
派生,它