foreach (string  var in students.Keys)
            {
                Console.WriteLine(var);
            }
var具体是什么参数,
如果仅是一个形参那么为什么会不允许修改
他到底是怎样从集合中取数据的
又是否copy了副本
 foreach (object  var in students.Keys)
            {
                Console.WriteLine(var);
            }

解决方案 »

  1.   

    var就是students中Keys集合的其中一项
      

  2.   

    foreach(一个人 in 一群人)
    {
       对每一个人进行操作
    }明白吗? 这属于迭代
      

  3.   

    foreach 中那个参数是在后面的基础上的。也就是in 后面是什么类型的数据,她也必须是什么类型的,否则编译不通过!因为只有相同类型了,才能判断是否在后面的集合或者数组之列!你看看foreach的参数就知道了。in 后面必须是数组或者集合,反正不能是单独的个体。就着啦
      

  4.   

    var关键字,在声明变量时就无需指定类型了,变量类型是在初始化时由编译器确定的。
      

  5.   

    如果仅是一个形参那么为什么会不允许修改
    --------
    不允许修改枚举项是foreach的特性,与var无关...var是推断类型...由编译器根据初始化语句右侧的表达式推断变量的类型...var关键字并不意味着“变体”,也不表示该变量是松散类型化变量或后期绑定变量。它只是表示由编译器确定和分配最适当的类型...
      

  6.   

    foreach 借助于 IEnumerator 工作,下面有个讨论:
    When should I use IEnumerator for looping in c#?
    http://stackoverflow.com/questions/456433/when-should-i-use-ienumerator-for-looping-in-c

    // 有个回答
    According to the C# language spec:    A foreach statement of the formforeach (V v in x) embedded-statement    is then expanded to:{
        E e = ((C)(x)).GetEnumerator();
        try {
                V v;
                while (e.MoveNext()) {
                        v = (V)(T)e.Current;
                        embedded-statement
                }
        }
        finally {
                ... // Dispose e
        }
    }The essense of your two examples are the same, but there are some important differences, most notably the try/finally.
      

  7.   

    (其实它就是在.net中实现了迭带器模式其实也可以自定义实现这个模式这两个接口)
      public interface IEnumerable{    IEnumerator GetEnumerator();}
      public interface IEnumerator
    {    bool MoveNext();    void Reset();    
                             Object Current { get; }}在方法中用yield return就可以实现这个直定义的迭带器.
    (平常的用法)class 小方  {
        static void Main(string[] args)
        {
            int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
            foreach (int i in fibarray)
            {
                System.Console.WriteLine(i);
            }
        }
    }
    输出
    0
    1
    2
    3
    5
    8
    13
      

  8.   

    C#的foreach语句不会解析为IL代码中的foreach语句,C#编译器会把foreach语句转换为IEnumerable接口的方法和属性,这就是为什么在C#中用foreach语句循环的集合对像都必需实现IEnumerable的原因
    假设有下面的foreach循环:
    foreach(Person p in Persons)
    {
        Console.Write(p);
    }
    foreach语句会解析为下面的代码段。首先,调用GetEnumerator()方法,获得数组的一个枚举。然后再使用while循环:
    IEnumerator enumerator = persons.GetEnumerator();
    while(enumerator.MoveNext())
    {
        Person p = (Person)enumerator.Current;
        Console.Write(p);
    }
    所以foreach (string  var in students.Keys) 中var的数据类型必需和students.Keys的数据类型一致,因为我们看到上面解析的中间代码里是采用强制转换将枚举对像值转换为你定义的对像,如果你声明的对像不一致就会报错了。