Code: Select all
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;
}
}
Das bedeutet, dass der Code viel später als der Aufruf zum Erstellen des Iterators fehlschlagen kann.
Möglicherweise – wenn der Bereich als Argument an eine andere Funktion übergeben wird. Sehr viel später.
Code: Select all
[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();
}
}
Allerdings fühlt sich das sehr wie eine hackige Problemumgehung an.
Gibt es eine (bessere) Möglichkeit, die Methode „Range“ dazu zu bringen, ihre Argumente zu validieren, bevor sie den Iterator zurückgibt?
Ich gehe davon aus, dass dies aufgetreten ist und bereits beantwortet, aber leider konnte ich es bei der Suche nicht finden.
Mobile version