为什么我们不能调试具有以下代码的收益返回的方法

本文关键字:代码 收益 返回 方法 不能 我们 调试 为什么 | 更新日期: 2023-09-27 18:35:07

以下是我的代码:

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();控件命中该点并在调试窗口中正确显示结果。但是,为什么控件不在 FilterWithYield 方法中停止呢?

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

为什么我们不能调试具有以下代码的收益返回的方法

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

IEnumerable方法yield return生成代码,使序列在枚举过程中变得懒惰。但是,当您执行此操作时

var sn = FilterWithYield();

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

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

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

var sn = FilterWithYield().ToList();