当前位置:  开发笔记 > 编程语言 > 正文

为什么IEnumerable <T>从IEnumerable继承?

如何解决《为什么IEnumerable<T>从IEnumerable继承?》经验,为你挑选了2个好方法。

这可能是一个老问题:为什么要IEnumerable继承IEnumerable

.NET就是这样做的,但它带来了一些麻烦.每次我编写一个类实现时IEumerable,我都要编写两个GetEnumerator()函数,一个用于IEnumerable,另一个用于IEnumerable.

并且,IList不会从IList继承.

我不知道为什么IEnumerable以其他方式设计.



1> Mark Bracket..:

直接从马的嘴里(Hejlsberg):

理想的情况是所有的泛型集合接口(例如ICollection,IList)将他们的非通用同行继承,使得通用接口实例可以与通用和非通用代码均可使用.例如,如果IList可以将代码传递给期望的代码,那将会很方便IList.

事实证明,唯一可能的通用接口是IEnumerable,因为只有IEnumerable反变量:In IEnumerable,类型参数T仅用于"输出"位置(返回值)而不用于"输入"位置(参数) ).ICollectionIList在输入和输出位置使用T,因此这些接口是不变的.(顺便说一句,如果只在输入位置使用T,那么它们就会反对变形,但这并不重要.)

<...剪断...>

那么,回答你的问题,IEnumerable继承IEnumerable因为它可以!:-)



2> Jon Skeet..:

答案IEnumerable是:"因为它可以在不影响类型安全的情况下".

IEnumerable是一个"只读"接口 - 所以通用形式比非通用形式更具体并不重要.你不会通过实现两者来打破任何事情.IEnumerator.Current返回object,而IEnumerator.Current返回T- 这没关系,因为你可以合法地转换为object,虽然它可能意味着拳击.

与此比较IList,并IList-你可以调用Add(object)IList,而这很可能是针对任何特定无效IList(比其他任何IList时候).

布拉德·阿布拉姆(Brad Abram)的博客与安德斯(Anders)对这个问题的回答.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有