2010-01-12 4 views
21

У меня есть метод с возвращает IEnumerable<T>, и я пытаюсь отладить код внутри этого метода.Отладка метода IEnumerable

Каждый раз, когда я выполняю код в Visual Studio во время отладки, он выполняет шаги над рассматриваемым методом.

Когда я помещаю точку останова внутри метода, она никогда не попадает. Код определенно работает, поскольку я тестировал yield return 'ing поддельный T's из метода.

Невозможно ли отлаживать IEnumerable методы таким образом, или я делаю что-то еще неправильно?

ответ

48

Этот метод попадает только при использовании элементов в IEnumerable. Помните, что IEnumerable lazy загружает элементы, поэтому только потому, что вы вызываете метод, возвращающий IEnumerable, не означает, что метод фактически вызывается в этой точке. Если вы хотите, чтобы попасть прямо, когда вы называете его, добавить ToList() в конце вашего вызова метода:

var result = myEnumerableMethod().ToList(); 
+0

Спасибо за это. Я знал, что есть логическая причина, но не мог вспомнить, почему. :) –

0

Это не должно быть никаких проблем для отладки IEnumerable реализации ... Может быть, вы просто используете неправильно .dll (если вы перечислитель во внешней библиотеке) ...

вы можете попробовать простой тест консоли и перейти отсюда

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (String foo in new Foo()) 
     { 
      Console.WriteLine(foo); 
     } 
    } 
} 

class Foo : IEnumerable<String> 
{ 
    #region IEnumerable<string> Members 

    public IEnumerator<string> GetEnumerator() 
    { 
     yield return "fake # 1"; 
     yield return "fake # 2"; 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    #endregion 
} 
Смежные вопросы