为什么我们不能调试具有以下代码的收益返回的方法
本文关键字:代码 收益 返回 方法 不能 我们 调试 为什么 | 更新日期: 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();