Пользовательская имплементация IEnumerator.Current. Определение поведения Current до вызова MoveNext
Допустим Current вызывается до MoveNext, что нужно сделать в этом случае? Какое должно быть поведение? Выбросить исключение? Или вернуть значение по умолчанию? В MSDN просто говорится, что Current должен/может быть неопределённым, но что будет хорошей практикой? Понятно, вопрос дискуссионный, но интересно мнение людей.
public struct Enumerator : IEnumerator<T>
{
// просто для примера: флаг, что MoveNext не был вызван, и, соответствено, Current не валиден
bool readyToWork;
// вариант 1
public T Current
{
get
{
if (readyToWork) return validCurrentValue;
else throw new SomeException("Call MoveNext first!");
}
}
// вариант 2
public T Current
{
get
{
if (readyToWork) return validCurrentValue;
else return default;
}
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
default же, посмотрите как это на классических коллекциях работает. Я бы не придумывал велосипед.
С другой стороны, любому разработчику понятно, что для начала перечисления нужно вызвать MoveNext. Поэтому при верной реализации итератора, материализующего перечисление, совершенно неважно что оно будет возвращать.