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

以下是我的代码:

class Program { static List MyList; static void Main(string[] args) { MyList = new List() { 1,24,56,7}; var sn = FilterWithYield(); } static IEnumerable FilterWithYield() { foreach (int i in MyList) { if (i > 3) yield return i; } } } 

我在FilterWithYield方法中有一个断点,但它根本没有达到断点。 我在调用点有一个中断,即var sn = FilterWithYield(); 控制命中此点并在调试窗口中正确显示结果。 但是为什么控制不在FilterWithYield方法中停止?

还有一个问题。 我读到yield将数据返回给调用者。如果将FilterWithYield方法的返回类型更改为int则通过error实现。如果yield关键字总是需要IEnumerable作为返回类型?

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

具有yield return IEnumerable方法会产生代码,使您的序列变得懒惰,因为您将通过枚举。 但是,当你这样做

 var sn = FilterWithYield(); 

你准备枚举序列,但你没有开始枚举它。

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

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

要么

 var sn = FilterWithYield().ToList();