Пользовательская имплементация 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. Поэтому при верной реализации итератора, материализующего перечисление, совершенно неважно что оно будет возвращать.

→ Ссылка