2012-02-17 115 views
2

我知道完全相同的问题出现在这里StackOverflow,但它不完全回答我的查询。集合<T>:它为什么既实现IEnumerable又实现IEnumerable <T>?

如果ICollection<T>工具IEnumerable<T>,它扩展IEnumerable,为什么从微软程序员添加IEnumerable作为该ICollection<T>实现的接口?

难道这不就是(语义和执行方面的明智),就像简单地写ICollection<T> : IEnumerable<T>一样吗?

回答

5

它说它实现IEnumerable,因为它实现IEnumerable

IEnumerable<T>继承IEnumerable,但它显然可以提供没有实现。实施IEnumerable<T>的类别还必须实施IEnumerable,无论它们是否明确表明它们这样做。

class Foo : IEnumerable<T> 
class Foo : IEnumerable<T>, IEnumerable 

无论哪种情况,都需要实现两个接口的成员。第二个类的定义对于那些查看类和/或文档的人来说很明显,这是一件好事。一个没有经验或不知情的读者可能不知道IEnumerable<T>带来IEnumerable随着它。他们可能可能不知道在期望IEnumerable的地方可以使用实现IEnumerable<T>的类。这只是向读者提供更多信息,平均而言,这只能是一件好事。

+2

而像IlDasm和Reflector这样的工具倾向于显示第二更长的形式。不管它是如何写的。 – 2012-02-17 18:55:46

+0

好的,所以它是为了可读性而不是提供任何语义/编程差异,是否正确? – Bober02 2012-02-17 19:18:35

+0

非常。它是可选的* list *附加的接口。无论哪种方式都需要实现。 – 2012-02-17 19:34:38

相关问题