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

这个问题从《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语句转换后就是泛型版本。


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值