Чудеса ключевого слова yield

Хорошо, пока я копался над созданием собственного перечислителя, я заметил такое поведение, которое касается yield

Допустим, у вас есть что-то вроде этого:

  public class EnumeratorExample 
  {

        public static IEnumerable<int> GetSource(int startPoint) 
        {
                int[] values = new int[]{1,2,3,4,5,6,7};
                Contract.Invariant(startPoint < values.Length);
                bool keepSearching = true;
                int index = startPoint;

                while(keepSearching) 
                {
                      yield return values[index];
                      //The mind reels here
                      index ++ 
                      keepSearching = index < values.Length;
                }
        }

  } 

Что делает это возможным под капотом компилятора, чтобы выполнить index ++ и остальную часть кода в цикле while после того, как вы технически выполните возврат из функции?

6
задан dexter 15 December 2010 в 22:54
поделиться