IEnumerable 接口

4

我不明白为什么IList实现了IEnumerable,考虑到IList已经实现了ICollection,而ICollection也实现了IEnumerable

3个回答

11
我猜你想知道为什么它声明实现了ICollectionIEnumerable,当第一个接口已经包含第二个接口时。我认为主要原因是为了明确清晰:这意味着人们不需要回到ICollection去检查是否已经扩展了IEnumerable
还有其他情况需要重新声明一个接口的实现,如果您想要重新实现以前在基类中显式实现的接口方法 - 但我不认为这是这种情况的原因。
编辑:我一直假设文档构建源代码具有包括两个接口的声明。另一种可能的选择是文档生成器自动提取所有接口。此时问题变成了“为什么文档生成器这样做”,答案几乎肯定仍然是“清晰易懂”。

+1 我的直觉也告诉我这是为了清晰起见,这可能启用了一些需要第一层继承的反射黑客。 - Sam Saffron
由于是接口(而不是类),重新实现并不是一个问题。 - Marc Gravell
1
我似乎找不到让反射检测任何差异的方法,我认为只有元数据接口知道这个定义。 - Sam Saffron

8

IList仅通过关联实现IEnumerable。也就是说,它之所以实现IEnumerable,是因为它继承了ICollection,而ICollectionIEnumerable。类型层次结构(虽然仅支持单继承)也会得到相同的结果。

class Enumerable {}
class Collection : Enumerable {}
class List : Collection {}

所以List是可枚举的;同样,IList也是IEnumerable

例如,如果我写:

interface IA {}
interface IB : IA { }
interface IC : IB { }

看一下元数据,会发现IC: IA, IB - 但这只是间接的;这里是IL:

.class private interface abstract auto ansi IA
{
}
.class private interface abstract auto ansi IB
    implements IA
{
}
.class private interface abstract auto ansi IC
    implements IB, IA
{
}

1
刚才给这个点踩的人,我希望你有勇气说出原因。我不会把它当成个人攻击(除非,当然,这只是出于私人仇恨)。 - Marc Gravell

1
如果您在ReSharper中打开代码,它会指出在IList上的IEnumerable接口声明是不必要的,因为它已经通过ICollection指定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接