IEnumerable是否应该实现IEnumerable接口
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接口相关推荐
- c html循环ienumerable,C#方法返回IEnumerable实现用foreach遍历
在C#中,只要函数返回IEnumerable,就能实现用foreach对元素进行遍历,代码如下 public class ReturnIEnumerable { public IEnumerable ...
- 了解下 IEnumerable、ICollection、IList 和 IQueryable 接口
在数据集合中,经常会用 IEnumerable.ICollection.IList 和 IQueryable 这些类型来定义变量和属性,今天就来了解下这些接口的特征及适用的场景. 以便我们增强代码的强 ...
- 关于迭代器中IEnumerable与IEnumerator的区别
首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...
- IEnumerable和IEnumerator 详解
IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象.IEnumerator对象有什么呢?它是一个真正的 ...
- IEnumerator,IEnumerable,IEnumerableT
1 接口IEnumerator,IEnumerable区别IEnumerable是一个声明式的接口,声明实现该接口的类就是"可迭代的enumerable",但并没用说明如 何实现迭 ...
- 为什么 IEnumerable 没有提供 ForEach ?
咨询区 Cameron MacFarland: 为什么 IEnumerable 接口没有 ForEach 扩展方法?我观察到能获取 ForEach 方法的类是 List<>,有谁知道这么设 ...
- 【IEnumerable】扩展方法的使用 C#
直接进入主题吧... IEnumerable : 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代. 好吧,迭代,我就理解成循环,这些名词真晦涩,没意思 今天看的是 Using Ext ...
- List vs IEnumerable vs IQueryable vs ICollection vs IDictionary
目录 集合 数组 数组列表 哈希表 堆栈 队列 列表 IList 具体类与接口的区别 IEnumerable IQueryable SQL事件探查器 如何跟踪查询生成TSQL和将加载多少条记录: IC ...
- IEnumerator和IEnumerable
IEnumerable和IEnumerator两个接口的语法定义.其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnu ...
最新文章
- python将scikit-learn自带数据集转换为pandas dataframe格式
- java怎么播放不了声音,怎么在java application中播放声音
- coffeescript 下的构造函数中如何使用return语句?
- QT实现3D多个视口渲染场景。
- oracle pi 3.14,Oracle中实现圆周率计算(一)
- java 8 stream_深度分析:java8的新特性lambda和stream流,看完你学会了吗?
- boot jersey_Jersey和Spring Boot入门
- 详解网络数字电视的实现方法与关键技术
- springCloud - 第9篇 - 同步配置文件(消息总线方式)
- iptables 指定网卡_LINUX系统下的IPTABLES防火墙系统讲解(二)实战操作
- C++ ACM模式输入输出
- 信息学奥赛一本通 2057:【例3.9 】星期几
- snmp error on SnmpMgrRequest 40
- java通信方式_java 认知底层的五种通信方式
- c语言dp算法解决背包问题,DP求解完全背包问题及其优化原理
- 【知了堂学习笔记】SQL查询总结(1)
- 用天平找次品的算法题,即三等分算法
- text 热敏打印机_GitHub - huangzhiyi/thermal_printer: Java实现网络小票打印机自定义无驱打印...
- 制造业MES系统数字化转型
- 95%置信区间的含义_怎样理解置信区间,解释95%的置信区间
热门文章
- python中ndarray如何生成单独的记事本文件_NumPy-快速处理数据--ndarray对象--数组的创建和存取...
- 区分docker stack/service/task
- Intel汇编语言程序设计学习-第六章 条件处理-上
- 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积计算方法列举 | 线性卷积计算案例一 | 根据 线性卷积 定义直接计算 卷积 )
- 【错误记录】GitHub 提交报错 ( OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 )
- 【数据挖掘】神经网络 后向传播算法 向前传播输入 案例计算分析 ( 网络拓扑 | 输入层计算 | 隐藏层计算 | 输出层计算 )
- 面试题16: 数值的整数次方
- SaltStack 安装、简单配置和远程执行
- Codeforces 167B Wizards and Huge Prize(概率dp)
- C# Dynamic特性