在执行IEnumerable <t>方法之前,该方法如何在C#中返回结果?

时间:2018-12-06 12:43:26

标签: c# yield

下面的代码块显示MyList中大于2的数字。

using System;
using System.Collections.Generic;
namespace CSharpBasics
{
    internal class Program
    {
        private static List<int> MyList = new List<int>();
        private static void Main(string[] args)
        {
            MyList.Add(1);
            MyList.Add(2);
            MyList.Add(3);
            MyList.Add(4);
            var test = FilterWithYield();
            foreach (int i in test)
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }
        private static IEnumerable<int> FilterWithYield()
        {
            foreach (int i in MyList)
            {
                if (i > 2)
                {
                    yield return i;
                }
            }
        }
    }
}

现在,当我们将断点设置为行foreach (int i in test)时,在执行 foreach 循环之前,test变量将具有FilterWithYield()的结果。怎么可能?我的理解是,直到迭代开始,IEnumerable方法才永远不会执行。

我在这里想念什么吗?

enter image description here

谢谢。

2 个答案:

答案 0 :(得分:6)

查看警告-Expanding the Result View will enumerate the IEnumerable…,通过查看结果视图,您可以枚举值。

答案 1 :(得分:2)

test可枚举的-本质上是枚举数提供者;枚举时,枚举器将被迭代。现在;枚举数和可枚举通常是不同的,但是可枚举(test)仍然是 something ,并且 something 仍然具有IDE可以探测的状态。 IDE可以检测可枚举,并为您迭代它们以显示内容。实际上,在某些情况下(顺序不可重复),这可能非常不便。因此,IDE在单击它之前确实警告过您-请参阅“扩展结果视图将枚举IEnumerable”。