Именованный Итератор и Исключения - PullRequest
4 голосов
/ 19 июля 2009

Я пишу метод, который должен проверять некоторые параметры и, если они проверены, возвращать IEnumerable. Э.Г.

public static IEnumerable<double> GetEnum(int param)
{
    if (!IsValidParameter(param))
    {
        throw new Exception();
    }

    while(true)
    {
        yield return 5.0;
    }
}

Однако я полагаю, что из-за ленивых вычислений, когда я запускаю свои модульные тесты с неверными параметрами, но пока не вызываю ни один из методов IEnumerable, исключение не выдается.

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
}

Я могу исправить ситуацию, построив IEnumerable в другой функции (скажем, Foo), затем проверить параметры в GetEnum и вызвать Foo, но есть ли решение без необходимости создания нескольких функций?

Ура, Юрген

Ответы [ 3 ]

9 голосов
/ 19 июля 2009

Из-за того, как определены блоки итераторов, в настоящее время вам нужно два метода для достижения этой цели:

public static IEnumerable<double> GetEnum(int param) {
    if (!IsValidParameter(param)) {
        throw new Exception();
    }
    return GetEnumCore(param);
}
private static IEnumerable<double> GetEnumCore(int param) {
    while(true) {
        yield return 5.0;
    }
}

Откладывается только блок итератора (GetEnumCore); GetEnum запускается немедленно, выполняя ваши проверки.

2 голосов
/ 19 июля 2009

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

var ie = GetEnum(bad_param).First();
2 голосов
/ 19 июля 2009

Не могли бы вы просто инициировать итерацию, используя базовый перечислитель?

[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
    var ie = GetEnum(bad_param);
    var en = ie.GetEnumerator();
    en.MoveNext();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...