static void Main(string[] args)
        {
            Person[] stu = new Person[3];
            for (int i = 0; i < 3; i++)
               {
                stu[i] = new Person();
               }
            //foreach (Person i in stu)
            //{
            //    i = new Person();
            //}
            stu[0].name = "苍井空";
            stu[1].name = "金贞娥";
            stu[2].name = "汤姆";
            stu[0].work();
            stu[1].work();
            stu[2].work();
            Console.ReadKey();
        }
    }
    class Person
    {
        public string name;
        public void work()
        {
            Console.WriteLine(name);
        }
    }在上面代码中,使用for循环全部new对象,为什么使用注释的foreach循环,就不行呢?for循环里面的i和foreach里面的i都是迭代变量吧,为什么前者行,后者不行.....谢谢!!!

解决方案 »

  1.   

    因为stu中变量还未实例化,所以你迭代循环期中时,都是非法的
      

  2.   

    foreach只读,for可写的.
    foreach用于遍历实现IEnumerable接口的集合的元素
    简洁 
     
      

  3.   

    foreach是使用object类型“装箱拆箱”的
      

  4.   

    foreach循环体中不能对元素赋值,即元素是只读的。
      

  5.   

    class Getnum
        {
            static int leijia()
            {
                int[] num = new int[5] { 1, 2, 3, 4, 5 };
                int sum = 0; 
                foreach (int i in num) 
                {
                    sum += i;
                }
                return sum;
            }
            public static void Main()
            {
                int number = leijia();
                Console.WriteLine(number);
                Console.ReadKey();
            }
        }这个foreach内部算不算赋值呢?还是有“=”号
      

  6.   

    跟“只读”没有关系,我也没有看到过说它是只读的。原因跟#3楼有些相像,foreach创建了一个新的object变量,这样你给新的变量赋值,并不会修改原来的对象。随便写一个代码:int i = 9;
    object j = i;
    j = 10;这也不会把i变为10啊!
      

  7.   

    实际上你的代码i = new Person();肯定是执行了,如果是“只读的”那么即使编译器没有本事检查出语法错误,运行时.net也会抛出异常的。它正常执行了!但是可惜,它就像上面给j变量赋值一样,并不会改变原来的引用变量stu[x]。
      

  8.   

    csdn的ubb出问题了吗?测试一下:int i = 9; 
    object j = i; 
    j = 10;