.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
派生,它