C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题
来源:互联网 发布:沪深300指数基金 知乎 编辑:程序博客网 时间:2024/06/09 23:04
这个问题从《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();
但是却出错了,错误是这样的:
Error1Cannot 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.cs1543enumerator
上面说是类型错误,仔细看一下,两个类不在同一个命名空间。
于是我加了一个显示转换
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
- C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题
- C#枚举器接口IEnumerator的实现
- c#中foreach与接口IEnumerator和IEnumerable
- c#中foreach与接口IEnumerator和IEnumerable
- c#实现Foreach枚举_IEnumerable和IEnumerator
- C#中的IEnumerable、IEnumerator与foreach深入探讨
- 实现IEnumerable和IEnumerator接口以支持foreach语句
- foreach与IEnumerator
- 实现IEnumerator接口的枚举器类型
- C#中的foreach语句
- C#中的foreach语句
- C# Foreach循环本质与枚举器
- C#枚举数IEnumerator
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的应用
- IEnumerable与IEnumerator在C#中的应用
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的使用
- tomcat数据库连接池配置
- Vim 启动错误Caught deadly signal SEGV
- java.lang.OutOfMemoryError: Java heap space 解决方法
- linux 信号 中断的系统调用
- php设计模式:值对象模式
- C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题
- ZOJ 1014 OPERAND
- IOS BezierPath 贝塞尔曲线画图详解
- 238,安装mysql出现Access denied for user 'root'@'localhost' (using password: YES)的问题
- ubuntu 的 document viewer evince 发生 Could not open X display 错误的处理
- Android 四大组件 —— 广播(广播机制解析)
- Interview Notes
- CAS单点登陆的原理
- poj2492 A Bug's Life(并查集)