Вы на самом деле не используете результат 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 # в глубине - которая является бесплатной главой в первом издании :) Хватайте это здесь .