码迷,mamicode.com
首页 > 其他好文 > 详细

问题记录

时间:2018-05-06 01:31:36      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:修改   分享图片   public   问题   获取   图片   rabl   yellow   app   

迭代变量

为什么foreach迭代变量不能修改值?我知道是在实现IEnumerator枚举器的时候Current属性设置为只读,但是问题是为什么将其设置为只读属性呢?而且在自定义实现该枚举器的时候,将其设置为读写的,还是会提示迭代变量不可更改,就是说foreach强行限制不允许迭代变量赋值,为什么要这样做?

目前我只能这样解释:foreach迭代变量每次都会去迭代当前变量地址,获取下一变量地址,如果给当前变量更新了值,地址就会变,foreach迭代就会出错。

这样的解释很牵强,希望有大神帮忙解释一下!同时也想多了解一下迭代的更多知识!

自定义foreach

技术分享图片
using System;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Spectrum spec = new Spectrum();
            foreach (var item in spec)
            {
                item = item + "123";//出错:迭代变量
                Console.WriteLine(item);
            }
        }
    }

    class ColorEnumerator : IEnumerator
    {
        string[] _colors;
        int position = -1;

        public ColorEnumerator(string[] colors)
        {
            _colors = new string[colors.Length];
            for(int i=0;i<_colors.Length;i++)
            {
                _colors[i] = colors[i];
            }
        }

        public object Current
        {
            get
            {
                if (position < 0 || position >= _colors.Length)
                    throw new InvalidOperationException();
                else
                    return _colors[position];
            }
            set//增加写
            {
                if (position < 0 || position >= _colors.Length)
                    throw new InvalidOperationException();
                else
                    _colors[position] = (string)value;
            }
        }

        public bool MoveNext()
        {
            if (position >= _colors.Length-1)
                return false;
            else
            {
                position++;
                return true;
            }
        }

        public void Reset()
        {
            position = -1;
        }
    }

    class Spectrum : IEnumerable
    {
        string[] colors = { "violet", "blue", "cyan", "green", "yellow", "orange", "red" };
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(colors);
        }
    }
}
View Code

 

问题记录

标签:修改   分享图片   public   问题   获取   图片   rabl   yellow   app   

原文地址:https://www.cnblogs.com/EasonDongH/p/8996781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!