日期:2014-05-17  浏览次数:20736 次

请问,这是个什么怪异现象

namespace 控制台
{
    class Program
    {
        static void Main()
        {
            Person p = new Person();
            p.GetResult();
            p.GG();
            Console.ReadKey();
        }
    }
    class Person 
    {
        List<int> list = new List<int>() { 0,1,2};
        public IEnumerable<int> GetResult()
        {
            Console.WriteLine("李四");
            foreach (int i in list)
            {
                yield return i;
            }
        }
        public void GG()
        {
            Console.WriteLine("张三");
        }
    }
}
上面的代码,为什么只输出了张三,没有输出李四呢?

------解决方案--------------------
p.GetResult();
->
p.GetResult().ToList();
------解决方案--------------------
引用:
Quote: 引用:

p.GetResult();
->
p.GetResult().ToList();
转换暂且不说,不管怎么说,输出总应该执行吧

不会执行,除非执行第一次迭代
------解决方案--------------------
也就是调用一次MoveNext
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

p.GetResult();
->
p.GetResult().ToList();
转换暂且不说,不管怎么说,输出总应该执行吧

不会执行,除非执行第一次迭代


yield的特性
------解决方案--------------------
再说仔细一点吧
p.GetResult().GetEnumerator().MoveNext();
------解决方案--------------------
看编译后的代码
------解决方案--------------------
这个是典型的Deferred execution
"Deferred execution is supported directly in the C# language by the