这个问题从《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. iOS开发——pch文件创建

    新换的公司,接手的项目里面连pch文件都没有,每次需要用到屏幕的宽高时,都是现写.今天既然碰到了,就把PCH这个玩意说一下. 1.Command+N,打开新建文件窗口:iOS->Other-&g ...

  2. label同时设置sizeToFit,NSTextAlignmentCenter不起作用

    问题:label要多行显示,按照这样子设置,iOS9以上work,iOS8无用 self.bookNameLabel.lineBreakMode = NSLineBreakByCharWrapping ...

  3. address2line 定位 Android c++奔溃位置

    Android调用c++出现奔溃,崩溃信息为如下: 10-11 15:15:13.541 D/AudioMTKStreamOut( 139): write(), buffer = 0x42bd9390 ...

  4. js数组之迭代方法

      ES5为数组对象定义了5个迭代方法(即递归,简单的说就是自己可以调用自己). 每个方法接收两个参数:要在每一项上运行的函数(接收3个参数:数组项的值,该项在数组中的位置,数组对象本身)和(可选的) ...

  5. 博客停更及OI退役公告

    停更&&OI退役 公告 高中OI之路就这样结束了,曾经想过回在NOI跪,APIO跪,HNOI跪却从未想过会在NOIP跪! 没办法自己作死啊,CCF感觉还是很良心的混个省一回来了,看以后 ...

  6. vuejs 子组件传递父组件的第二种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. centos6.6-------DHCP服务配置

    一.为一个单一的网段提供地址服务 软件包:  dhcp配置文件:  /etc/dhcp/dhcpd.conf租约文件:     /var/lib/dhcpd/dhcpd.leases监听端口:     ...

  8. c++初学(电梯实验加强版)

    Elevator.h class Elevator{public:    Elevator();    ~Elevator();    void getNowNum();        void Se ...

  9. java中集合框架

    java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. 在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接 ...

  10. Cannot create PoolableConnectionFactory (ORA-28040: No matching authentication protocol

    Oracle 12c 如果java报这个错误,用oracle自带的ojdbc6.jar,可以解决这个问题.