以下是我的代码:
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,那么生成关键字是否始终需要IEnumerable<T>
作为返回类型?
答案 0 :(得分:16)
您可以调试该方法。问题是,您尝试访问的代码永远不会被执行。
带有IEnumerable
的 yield return
方法生成的代码会让您的序列变得懒散,因为您将通过枚举。但是,当你这样做时
var sn = FilterWithYield();
你准备枚举序列,但是你没有开始枚举它。
另一方面,如果您在结果中添加foreach
循环或调用ToList()
,您的断点就会受到影响:
foreach (var n in FilterWithYield()) {
Console.WriteLine(n);
}
或
var sn = FilterWithYield().ToList();