Cannot step into a method returning IEnumerable?

前端 未结 4 747
没有蜡笔的小新
没有蜡笔的小新 2020-12-15 17:29

I have a method that returns an IEnumerable like this..

public virtual IEnumerable ToPages(){
  // foreach logic
  yield return pages;

  // more         


        
相关标签:
4条回答
  • 2020-12-15 18:10

    Your enumerable method will only execute once you actually try to access the members.

    This is called "Deferred Execution" (see http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx)

    Try actually accessing the IEnumerable which is returned, or just call;

    var p = obj.ToPages().ToList();
    
    0 讨论(0)
  • 2020-12-15 18:11

    Try putting a break on the yield. That should fix it.

    0 讨论(0)
  • 2020-12-15 18:26

    The method isn't run until you enumerate into it.

    foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.
    
    0 讨论(0)
  • 2020-12-15 18:27

    As others have noted, the body of an iterator block is not executed until the iterator is actually moved. Just creating the iterator does nothing other than creating it. People often find this confusing.

    If the design and implementation of iterator blocks interests you, here are some good articles on the subject:

    Raymond Chen: (short introduction to the basic points)

    http://blogs.msdn.com/b/oldnewthing/archive/2008/08/12/8849519.aspx

    http://blogs.msdn.com/b/oldnewthing/archive/2008/08/13/8854601.aspx

    http://blogs.msdn.com/b/oldnewthing/archive/2008/08/14/8862242.aspx

    Jon Skeet: (long, in depth)

    http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

    Eric Lippert (me): (advanced scenarios and corner cases)

    http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/

    0 讨论(0)
提交回复
热议问题