2011-04-18 8 views
17

Mam metodę, która zwraca IEnumerable tak ..Nie można przejść do metody zwracającej IEnumerable <T>?

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

    // more foreach logic 
    yield return otherPages; 

    // etc 
} 

Metoda wydaje się działać ... w pewnym sensie. Ale to, co naprawdę zaskakuje, to to, że nie mogę tego zrobić! Umieszczę punkty debugowania dookoła, a debugger po prostu przechodzi przez nie !!!

Czy ktoś wie, dlaczego tak się mogło stać?

+0

przepraszam, jeśli wydaje się to głupie pytanie ... Ty nie zrobił” t zastąpić go w klasie pochodnej zrobiłeś? –

Odpowiedz

27

Metoda nie zostanie uruchomiona, dopóki jej nie wyliczysz.

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

To jest solidna odpowiedź. IEnumerable <> zawsze oznacza leniwe wykonanie. Jest to jedna z podstawowych różnic między pracą z powiedzeniem IEnumerable a Listą . IEnumerable smak po prostu zwróci instrukcje iteracji, gdy nadejdzie czas. Lista faktycznie przejdzie przez kolekcję i natychmiast wyświetli wyniki. –

+0

To zadziałało ...ale to jest po prostu dziwne. Dlaczego zachowuje się w ten sposób? – Ciel

+1

Przyjmuję twoją odpowiedź, gdy StackOverflow pozwoli mi zająć 9 minut. Dzięki. To naprawdę było dla mnie kłopotliwe. – Ciel

0

Spróbuj wprowadzić przerwę w wydajności. To powinno to naprawić.

+0

Co masz na myśli? Umieściłem punkty przerwania na każdym wierszu w całej metodzie i wciąż nigdy nie wkraczam do niego. – Ciel

+0

"yield" jest momentem, w którym funkcja zwraca, powinna się na tym złamać. –

+0

To powinno, tak. Ale tak nie jest. – Ciel

5

jak inni to zauważyli, ciało bloku iteratora nie jest wykonywany aż iterator jest rzeczywiście przeniósł. Po prostu tworzenie iteratora nie robi nic poza jego tworzeniem. Ludzie często uważają to za mylące.

Jeśli projekt i realizacja bloków iteracyjnej interesów Państwo, oto kilka dobrych artykułów na ten temat:

Raymond Chen: (krótkie wprowadzenie do podstawowych punktów)

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: (l Ong, w głębi)

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

Eric Lippert (ME): (zaawansowane scenariusze i przypadki rogu)

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

Powiązane problemy