关于c#:为什么我们不能为以下代码调试带有yield return的方法?

Why can't we debug a method with yield return for the following code?

本问题已经有最佳答案,请猛点这里访问。

以下是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Program {
    static List<int> MyList;
    static void Main(string[] args) {
        MyList = new List<int>() { 1,24,56,7};
        var sn = FilterWithYield();
    }
    static IEnumerable<int> FilterWithYield() {
        foreach (int i in MyList) {
            if (i > 3)
                yield return i;
        }
    }
}

我在FilterWithYield方法中有一个断点,但它根本没有达到断点。我在调用点有一个中断,即var sn = FilterWithYield();控件点击该点并在调试窗口中正确显示结果。但是为什么不停止在过滤器中的控制和产量方法呢?

还有一个问题。我读到yield向调用者返回数据。如果是这样,如果更改了filterwithyield方法的返回类型以通过错误对其进行int,yield关键字是否总是需要IEnumerable作为返回类型?


您可以调试该方法。问题是,您试图访问的代码永远不会被执行。

使用yield returnIEnumerable方法在进行枚举时生成代码,使序列变慢。但是,当你这样做的时候

1
var sn = FilterWithYield();

准备枚举序列,但不开始枚举它。

另一方面,如果添加一个foreach循环或在结果上调用ToList(),则断点将被击中:

1
2
3
foreach (var n in FilterWithYield()) {
    Console.WriteLine(n);
}

1
var sn = FilterWithYield().ToList();