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语句转换后就是泛型版本。
可能是我对继承的理解有误,但书上应该不会犯这种错误吧?所以现在有些弄不懂。