这个问题从《C#高级编程》数组一节中的foreach语句(6.7.2)发现的。

因为示例代码与之前的章节连贯,所以我修改了一下,把自定义类型改为了int

int[] bs = { 2, 3, 5, 5, 1, 3, 6 };
            foreach(var b in bs)
            {
                Console.Write(b+",");
            }
Console.ReadKey();

以上代码的运行结果为:

2,3,5,5,1,3,6,

foreach语句其实使用了枚举器来实现的,经过c#编译器时会转成以下的形式:

int[] bs={2,3,5,5,1,3,6};
IEnumerator<int> enumerator = bs.GetEnumerator();
while (enumerator.MoveNext())
    {
        int b = enumerator.Current;
          Console.Write(b+",");
    }
Console.ReadKey();

但是却出错了,错误是这样的:

Error	1	Cannot implicitly convert type 'System.Collections.IEnumerator' to 'System.Collections.Generic.IEnumerator<int>'. An explicit conversion exists (are you missing a cast?)	D:\我的文档\Visual Studio 2008\Projects\ProfessionalCSharp\enumerator\Program.cs	15	43	enumerator

上面说是类型错误,仔细看一下,两个类不在同一个命名空间。

于是我加了一个显示转换

IEnumerator<int> enumerator = (IEnumerator<int>)bs.GetEnumerator();

然后就跑起来了:)

然而却看不到结果,控制台一片黑。。。等了一会儿跳出错误了,无法强转。

我仔细看了看书上的代码,书上的没有类型转换。

于是,转到定义出查看。它们确实不在一个命名空间下。查了查书,枚举器还有一个无泛型的接口IEnumerable。然后比对了一下,IEnumerable<T>实现了IEnumerable接口,却会出现无法类型转换的问题,泛型版本没有增加自己的方法啊。

所以只好用以前还没有泛型的时候的方法

int[] bs={2,3,5,5,1,3,6};
IEnumerator enumerator = bs.GetEnumerator();
while (enumerator.MoveNext())
{
int b = (int)enumerator.Current;
Console.Write(b+",");
}
Console.ReadKey();

这时候成功运行了。但是,这样的话泛型版本就无法在这里使用了。可书上说,c#编译器将foreach语句转换后就是泛型版本。

可能是我对继承的理解有误,但书上应该不会犯这种错误吧?所以现在有些弄不懂。

C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题的更多相关文章

  1. C#枚举器接口IEnumerator的实现

    原文(http://blog.csdn.net/phpxin123/article/details/7897226) 在C#中,如果一个类要使用foreach结构来实现迭代,就必须实现IEnumera ...

  2. C#2.0中使用yield关键字简化枚举器的实现

    我们知道要使用foreach语句从客户端代码中调用迭代器,必需实现IEnumerable接口来公开枚举器,IEnumerable是用来公开枚举器的,它并不实现枚举器,要实现枚举器必需实现IEnumer ...

  3. PHP:第二章——PHP中的foreach语句

    foreach语句提供了遍历数组的 <?php header("Content-Type:text/html;charset=utf-8"); $arr=array(&quo ...

  4. C#深度学习の枚举类型(IEnumerator,IEnumerable)

    一.关于枚举的含义 .Net提供了可枚举类型的接口IEnumerable和枚举器接口IEnumerator,程序集System.Collections 另: IQueryable 继承自IEnumer ...

  5. 从foreach语句枚举元素看数组

    在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的 ...

  6. C#中foreach语句的迭代器实现机制

    C#中的foreach语句可用于循环遍历某个集合中的元素,而所有的只要支持了IEnumerable或IEnumerable<T>泛型接口的类型都是可以 用foreach遍历的.其具体的遍历 ...

  7. 自定义一个可以使用foreach语句进行迭代的类(IEnumerable)

    在c#中,凡是实现了IEnumerable接口的数据类型都可以用foreach语句进行迭代访问.所以,我们要定义一个可以使用foreach进行迭代访问的类,就必须要实现IEnumerable接口. / ...

  8. C#图解教程 第十八章 枚举器和迭代器

    枚举器和迭代器 枚举器和可枚举类型 foreach语句 IEnumerator接口 使用IEnumerable和IEnumerator的示例 泛型枚举接口迭代器 迭代器块使用迭代器来创建枚举器使用迭代 ...

  9. C# 枚举器(enumerator)

    总结: 1.枚举器就像是序列中的"游标"或"书签".可以有多个"书签",移动其中任何一个都可以枚举集合,与其他枚举器互不影响.用来遍历数据结 ...

随机推荐

  1. ucos移植指南

    指定堆栈数据类型(宽度) typedef unsigned int OS_STK; 指定Ucos移植方法3中保存cpu状态寄存器的变量的宽度 typedef unsigned int OS_CPU_S ...

  2. iOS 生产证书

    首先登陆https://developer.apple.com(99美元账号) 选择iOS Developer program 板块下的 Certificates,Identifiers & ...

  3. NavigationView学习笔记

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  4. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 4[Submit][Status][Web Board] ...

  5. poj 3641 ——2016——3——15

    传送门:http://poj.org/problem?id=3461 题目大意:给你两个字符串p和s,求出p在s中出现的次数. 题解:这一眼看过去就知道是KMP,作为模板来写是最好不过了.... 这道 ...

  6. debugger 调试的一些经验

    1. 如果没有firebug , 可以用firebug-lite.js 内嵌的调试方式. 2. console.log 不是所有浏览器都支持console.log 在IE或者没有调试窗口的浏览器中,c ...

  7. Javascript 浮点运算问题分析与解决

    分析 JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的. 浮点数的精度问题不是JavaScript特有的,因为有些小数 ...

  8. 【转】java调用存储过程和函数

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  9. Selenium2(java)框架设计 九

    设计框架原则: 数据分离,业务层和逻辑层不要混杂在一起. 设计图: 框架结构初始化: com.wymall.test:这是存放这个框架源代码的根目录 base:里面有个基类(BaseParpaare. ...

  10. [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds...

    INSERT INTO `ftms_active_dealer`(dealer_code,dealer_name,active_id,dealer_state)VALUES('415A1','贺磊'1 ...