Не удается войти в блок итератора во время отладки (C#)

Я пытаюсь отладить свой код, который выполняется из проекта модульного тестирования, но когда я пытаюсь перейти к методу, он просто переходит прямо на следующую строку, и точка останова внутри этого метода не срабатывает. Метод находится в классе, который находится в другом проекте, но весь код построен в режиме отладки, и я безуспешно пытался очистить и перестроить решение.

Однако это произошло только после того, как я добавил в метод блок итератора. Когда я удаляю его и перестраиваю, я могу вмешаться. Странный?

Я использую Visual Studio 2010 Beta 1, может ли это быть ошибкой?


person Charlie    schedule 21.06.2009    source источник
comment
Мы получаем этот отчет об ошибке достаточно часто. Вот небольшая загадка, ответ на которую вы теперь знаете: blogs.msdn.com/ericlippert/archive/2007/09/05/ blogs.msdn.com/ericlippert/archive/2007/09/06/   -  person Eric Lippert    schedule 21.06.2009


Ответы (2)


Блоки итераторов используют отложенное выполнение, что означает: пока вы не начнете перебирать данные, ничего не выполняется.

Итак: были ли данные повторены? Что-нибудь зацикливается на значениях? Если вам нужно добавить логику проверки, которая запускается как можно раньше, вам в настоящее время нужны два метода:

public static IEnumerable<int> GetNumbers(int from, int to) {
    // this validation runs ASAP (not deferred)
    if (to < from) throw new ArgumentOutOfRangeException("to");
    return GetNumbersCore(from, to);
}
private static IEnumerable<int> GetNumbersCore(int from, int to) {
    // this is all deferred
    while (from <= to) {
        yield return from++;
    }
}
person Marc Gravell    schedule 21.06.2009

Марк прав. Метод отложен, и вы не можете войти в метод, пока итератор не выполнится.

Когда мне нужно отладить блок итератора в модульном тесте, я делаю следующее. Предположим, что метод называется GetStuff.

[TestMethod]
public void TestGetStuff() {
  var obj = GetStuffObje();
  var list = obj.GetStuff().ToList();
}

Вызов .ToList() заставит итератор выполниться до конца. Затем я устанавливаю точку останова внутри метода GetStuff и запускаю сеанс отладки.

person JaredPar    schedule 21.06.2009