C#2.0的遍历器(Iterator),应该是对Gamma提出的Iterator设计模式的实现。在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable <T> ,或者继承了泛型接口IEnumerable <T> 的任何一个构造类型(如IEnumerable <int> ),那么称该类型是“可遍历的”(“可枚举的”)。

MSDN中创建遍历器的示例代码是:

public   class   Stack <T> :   IEnumerable <T>
{
    T[]   items;
    int   count;
    public   void   Push(T   data)   {...}
    public   T   Pop()   {...}
    public   IEnumerator <T>   GetEnumerator()
    {
        for   (int   i   =   count   –   1;   i   > =   0;   --i)
            yield   return   items[i];
    }
}

但这样编译将会报错“Stack不会实现接口成员IEnumerable.GetEnumerator”

究其原因,是由于IEnumerable <T> 居然继承了IEnumerable接口,那么Stack <T> 也就隐含继承了IEnumerable,因此需要实现其返回类型为IEnumerator的GetEnumerator方法。在这里,类中需要加上下面的代码才能保证正确:

IEnumerator   IEnumerable.GetEnumerator()
{
    return   GetEnumerator();
}

这会给初学者带来很大的迷惑。有些外文资料解释说,所有的新的泛型接口都应该继承以前object型对应接口。个人认为,不应该让IEnumerable <T> 继承IEnumerable;在需要时,可以让一个类继承IEnumerable,又继承IEnumerable <T> ,那就把两个接口都写出来好了:
public   class   Stack <T> :   IEnumerable <T> ,   IEnumerable

但实际上,.NET   Framwork中的大量泛型接口都不存在这种情况,如IComparer <T> 没有继承IComparer,ICollection <T> 没有继承ICollection,等等。

而且,在.NET   Framwork   2.0的Beta2版本中,并没有出现这种情况,而MSDN中的代码原来是可以通过编译的。只是到了正式版,IEnumerable <T> 就突然多继承了一个IEnumerable(此外还有IEnumerator <T> 继承了IEnumerator)

IEnumerable是否应该实现IEnumerable接口相关推荐

  1. c html循环ienumerable,C#方法返回IEnumerable实现用foreach遍历

    在C#中,只要函数返回IEnumerable,就能实现用foreach对元素进行遍历,代码如下 public class ReturnIEnumerable { public IEnumerable ...

  2. 了解下 IEnumerable、ICollection、IList 和 IQueryable 接口

    在数据集合中,经常会用 IEnumerable.ICollection.IList 和 IQueryable 这些类型来定义变量和属性,今天就来了解下这些接口的特征及适用的场景. 以便我们增强代码的强 ...

  3. 关于迭代器中IEnumerable与IEnumerator的区别

    首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...

  4. IEnumerable和IEnumerator 详解

    IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象.IEnumerator对象有什么呢?它是一个真正的 ...

  5. IEnumerator,IEnumerable,IEnumerableT

    1 接口IEnumerator,IEnumerable区别IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的enumerable",但并没用说明如 何实现迭 ...

  6. 为什么 IEnumerable 没有提供 ForEach ?

    咨询区 Cameron MacFarland: 为什么 IEnumerable 接口没有 ForEach 扩展方法?我观察到能获取 ForEach 方法的类是 List<>,有谁知道这么设 ...

  7. 【IEnumerable】扩展方法的使用 C#

    直接进入主题吧... IEnumerable : 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代. 好吧,迭代,我就理解成循环,这些名词真晦涩,没意思        今天看的是 Using Ext ...

  8. List vs IEnumerable vs IQueryable vs ICollection vs IDictionary

    目录 集合 数组 数组列表 哈希表 堆栈 队列 列表 IList 具体类与接口的区别 IEnumerable IQueryable SQL事件探查器 如何跟踪查询生成TSQL和将加载多少条记录: IC ...

  9. IEnumerator和IEnumerable

    IEnumerable和IEnumerator两个接口的语法定义.其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnu ...

最新文章

  1. python将scikit-learn自带数据集转换为pandas dataframe格式
  2. java怎么播放不了声音,怎么在java application中播放声音
  3. coffeescript 下的构造函数中如何使用return语句?
  4. QT实现3D多个视口渲染场景。
  5. oracle pi 3.14,Oracle中实现圆周率计算(一)
  6. java 8 stream_深度分析:java8的新特性lambda和stream流,看完你学会了吗?
  7. boot jersey_Jersey和Spring Boot入门
  8. 详解网络数字电视的实现方法与关键技术
  9. springCloud - 第9篇 - 同步配置文件(消息总线方式)
  10. iptables 指定网卡_LINUX系统下的IPTABLES防火墙系统讲解(二)实战操作
  11. C++ ACM模式输入输出
  12. 信息学奥赛一本通 2057:【例3.9 】星期几
  13. snmp error on SnmpMgrRequest 40
  14. java通信方式_java 认知底层的五种通信方式
  15. c语言dp算法解决背包问题,DP求解完全背包问题及其优化原理
  16. 【知了堂学习笔记】SQL查询总结(1)
  17. 用天平找次品的算法题,即三等分算法
  18. text 热敏打印机_GitHub - huangzhiyi/thermal_printer: Java实现网络小票打印机自定义无驱打印...
  19. 制造业MES系统数字化转型
  20. 95%置信区间的含义_怎样理解置信区间,解释95%的置信区间

热门文章

  1. python中ndarray如何生成单独的记事本文件_NumPy-快速处理数据--ndarray对象--数组的创建和存取...
  2. 区分docker stack/service/task
  3. Intel汇编语言程序设计学习-第六章 条件处理-上
  4. 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算方法列举 | 线性卷积计算案例一 | 根据 线性卷积 定义直接计算 卷积 )
  5. 【错误记录】GitHub 提交报错 ( OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 )
  6. 【数据挖掘】神经网络 后向传播算法 向前传播输入 案例计算分析 ( 网络拓扑 | 输入层计算 | 隐藏层计算 | 输出层计算 )
  7. 面试题16: 数值的整数次方
  8. SaltStack 安装、简单配置和远程执行
  9. Codeforces 167B Wizards and Huge Prize(概率dp)
  10. C# Dynamic特性