C# 为什么不是';将结果添加到列表时是否执行方法调用?

C# 为什么不是';将结果添加到列表时是否执行方法调用?,c#,generics,ienumerable,iterable,C#,Generics,Ienumerable,Iterable,当使用res.Add(Repeat(item,nr))将Repeat(item,nr))添加到res时,不会执行Repeat方法 为什么??我使用了调试器,但它不执行它 public class Program { public static IEnumerable<IEnumerable<T>> Echo<T>(IEnumerable<T> src, int nr) { List<IEnumerable<

当使用
res.Add(Repeat(item,nr))
Repeat(item,nr))
添加到
res
时,不会执行
Repeat
方法

为什么??我使用了调试器,但它不执行它

public class Program
{
    public static IEnumerable<IEnumerable<T>> Echo<T>(IEnumerable<T> src, int nr)
    {
        List<IEnumerable<T>> res = new List<IEnumerable<T>>();
        foreach (T item in src)
        {
            Console.Write(item);
            res.Add(Repeat(item, nr));
        }
        return res;
    }

    static IEnumerable<T> Repeat<T>(T item, int nr)
    {
        for (int i = 0; i < nr; i++)
        {
            Console.Write(item);
            yield return item;
        }
    }

    public static void Main()
    {
        string[] src = { "a", "b", "c" };
        Echo(src, 2);
    }

}
公共类程序
{
公共静态IEnumerable回音(IEnumerable src,int nr)
{
List res=新列表();
foreach(src中的T项)
{
控制台。写入(项);
决议添加(重复(项目,编号));
}
返回res;
}
静态IEnumerable重复(T项,整数)
{
对于(int i=0;i
使用
yield return
构建的枚举数在迭代之前不会执行。因此,您需要一些代码来迭代添加到列表中的枚举数。由于您从未对Echo返回的枚举数执行过任何操作(更不用说其中的项了),因此枚举数永远不会执行。

迭代器方法就是这样工作的——它们生成
IEnumerable
直到有人调用
GetEnumerator
并使用它时才会执行任何操作<调用了code>Repeat,但实际命中的只是编译器生成的生成
IEnumerable
实例的代码,而不是迭代器方法的主体——因此调试器不会显示正在运行的代码。请尝试将.ToList()添加到回显行:
Echo(src,2).ToList()@Neil,它只会枚举外部集合-列表中的集合仍然不会被枚举。您可以使用
SelectMany().ToList()
枚举内部集合。