C # выход во вложенном методе - PullRequest
17 голосов
/ 24 марта 2010

Если я перейду к следующему коду, вызов ReturnOne () будет пропущен.

static IEnumerable<int> OneThroughFive()
{
    ReturnOne();
    yield return 2;
    yield return 3;
    yield return 4;
    yield return 5;
}

static IEnumerator<int> ReturnOne()
{
    yield return 1;
}

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

1 Ответ

30 голосов
/ 24 марта 2010

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

static IEnumerable<int> OneThroughFive()
{
    foreach (int x in ReturnOne())
    {
        yield x;
    }
    yield return 2;
    yield return 3;
    yield return 4;
    yield return 5;
}

C # (в настоящее время, по крайней мере, :) не имеет своего рода конструкцию yield all.

Тот факт, что вы не вступаете в него, не имеет ничего общего с тем фактом, что вы получили вызов в блоке итератора - просто пока вы не начнете , используя результат блок итератора, ни один код не выполняется. Вот почему вам нужно отделить проверку аргументов от уступки. Например, рассмотрим этот код:

public IEnumerator<string> ReturnSubstrings(string x)
{
    if (x == null)
    {
         throw ArgumentNullException();
    }
    for (int i = 0; i < x.Length; i++)
    {
         yield return x.Substring(i);
    }
}
...
ReturnSubstring(null); // No exception thrown

Вам нужно написать это так:

public IEnumerator<string> ReturnSubstrings(string x)
{
    if (x == null)
    {
         throw ArgumentNullException();
    }
    return ReturnSubstringsImpl(x);
}

private IEnumerator<string> ReturnSubstringsImpl(string x)
{
    for (int i = 0; i < x.Length; i++)
    {
         yield return x.Substring(i);
    }
}

Для получения более подробной информации, прочитайте главу 6 C # в глубине - которая является бесплатной главой в первом издании :) Хватайте это здесь .

...