比如
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");foreach(string s in x)
{
}编译器展开成等价如下形式的代码:
ArrayList x=new ArrayList();
x.Add(10);
x.Add("SS");IEnumerator enumerator = (x).GetEnumerator();
try {
   while (enumerator.MoveNext()) {
      string element = (string)enumerator.Current; // here is casting occures **************
      // loop body;
   }
}
finally {
   IDisposable disposable = enumerator as System.IDisposable;
   if (disposable != null) disposable.Dispose();
}
注意编译器会在***********处增加强制类型转换。如果ArrayList中的元素不都是string,会报运行时错误。

解决方案 »

  1.   

    lz 你是拿网络上的文章来故意提问吧?随便搜一下就有一堆类似文章:http://www.cnblogs.com/yukaizhao/archive/2011/10/19/csharp_box_unbox_2.html
      

  2.   

    也就是在foreach里,你声明啥类型变量,编译器会强制转成啥类型吗?
    好吧,记下来,
    我有个缺点,就是书上没讲到的知识点,我自已遇到的问题,即使后来知道答案了,但是总感觉自己无法理解,只能死记住。
    要是书上一开始就说会强制类型转换,我就会很理解的样子,冏。
      

  3.   

    如果foreach需要你自己强制转换,那跟for还有任何区别?
      

  4.   

    冏,我有那么无聊吗?
    我看《C井入门经典》第六版239页的代码时碰到的
    我认为LZ并不是故意来提问的。
    或许你听说过“不完全信息静态博弈”这个概念,显然一个人遇到的问题,99.999999%在Internet上面都能找到答案。但为啥还是会有那么多人提问?互联网是一个巨大的信息数据库,但是并不是所有人都完全掌握的。
    ArrayList x=new ArrayList(); x.Add(10); x.Add("SS");   foreach(string s in x) { } 如这段代码,foreach语句也可以这样写:
                    foreach (Object stemp in x)
                    {
                        Console.WriteLine(stemp.ToString() + " ");
                    }foreach语句相比for的好处在于同样实现遍历,但去掉了迭代器,不需要进行边界检查。要知道数组越界是常见问题。