Ciel
Ciel

Reputation: 17772

Cannot step into a method returning IEnumerable<T>?

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

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

  // more foreach logic
  yield return otherPages;

  // etc
}

The method seems to work ... in a way. But what's really baffling is that I cannot step into it! I place debugger points all around, and the debugger just passes right through them!!!

Does anyone know why this might occur?

Upvotes: 32

Views: 4087

Answers (4)

Eric Lippert
Eric Lippert

Reputation: 660503

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)

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/

Upvotes: 10

Chris McAtackney
Chris McAtackney

Reputation: 5242

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();

Upvotes: 5

Talljoe
Talljoe

Reputation: 14827

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

foo.ToPages().ToList() // will enumerate and your breakpoint will be hit.

Upvotes: 42

Gordon Thompson
Gordon Thompson

Reputation: 4844

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

Upvotes: 0

Related Questions