这可能是一个老问题:为什么要IEnumerable
继承IEnumerable
?
.NET就是这样做的,但它带来了一些麻烦.每次我编写一个类实现时IEumerable
,我都要编写两个GetEnumerator()
函数,一个用于IEnumerable
,另一个用于IEnumerable
.
并且,IList
不会从IList继承.
我不知道为什么IEnumerable
以其他方式设计.
直接从马的嘴里(Hejlsberg):
理想的情况是所有的泛型集合接口(例如
ICollection
,IList
)将他们的非通用同行继承,使得通用接口实例可以与通用和非通用代码均可使用.例如,如果IList
可以将代码传递给期望的代码,那将会很方便IList
.事实证明,唯一可能的通用接口是
IEnumerable
,因为只有IEnumerable
反变量:InIEnumerable
,类型参数T仅用于"输出"位置(返回值)而不用于"输入"位置(参数) ).ICollection
并IList
在输入和输出位置使用T,因此这些接口是不变的.(顺便说一句,如果只在输入位置使用T,那么它们就会反对变形,但这并不重要.)<...剪断...>
那么,回答你的问题,IEnumerable
继承IEnumerable
因为它可以!:-)
答案IEnumerable
是:"因为它可以在不影响类型安全的情况下".
IEnumerable
是一个"只读"接口 - 所以通用形式比非通用形式更具体并不重要.你不会通过实现两者来打破任何事情.IEnumerator.Current
返回object
,而IEnumerator
返回T
- 这没关系,因为你可以合法地转换为object
,虽然它可能意味着拳击.
与此比较IList
,并IList
-你可以调用Add(object)
上IList
,而这很可能是针对任何特定无效IList
(比其他任何IList
时候).
布拉德·阿布拉姆(Brad Abram)的博客与安德斯(Anders)对这个问题的回答.