Код: Выделить всё
public static IEnumerable Range(double startingValue, double step, int count)
{
// I would really like this validation to be performed before returning the iterator
if (count < 0) throw new ArgumentOutOfRangeException("count must be >= 0");
double currentValue = startingValue;
for (int i = 0; i < count; i++)
{
yield return currentValue;
currentValue += step;
}
}
Это означает, что код может завершиться неудачей гораздо позже, чем вызов создания итератора.
Возможно, если диапазон передается в качестве аргумента другой функции. Очень намного позже.
Код: Выделить всё
[TestMethod]
[TestCategory(nameof(TestCategoryEnum.UnitTest))]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void TestCreateRangeNegativeCount_01()
{
var range = Range(1.0, 1.0, -100);
// Should never reach here
Assert.Fail(); // Uh-uh. Absolutely reaches here...
foreach (var obs in range)
{
Assert.Fail();
}
}
Однако это очень похоже на хакерский обходной путь.
Есть ли какой-нибудь (лучший) способ заставить метод «Range» проверять свои аргументы перед возвратом итератора?
Я вполне ожидаю, что с этим столкнулись и уже ответил, но, к сожалению, не смог найти его при поиске.
Подробнее здесь: https://stackoverflow.com/questions/798 ... up-and-ret
Мобильная версия