Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
единственное, в чем мы можем быть уверены при работе с IEnumerable, это то, что метод IEnumerable.GetEnumerator() возвращает ненулевой (non-null) объект энумератораА потом запрещаете другой реализации кидать исключения:
Такая имплементация нарушает LSP, т.к. интерфейс IEnumerable сам по себе не имеет никаких предусловий, требующих наличия открытого подключения к базе данных.Здесь либо и то, и другое нарушают LSP, потому что накладывают дополнительные ограничения на вызовы методов, либо ничто не нарушает.
метод Process ожидает от объекта, реализующего IEnumerable, большего, чем этот интерфейс обещаетВовсе нет. Нигде не объявлено, что Process работает с конечной коллекцией. Бесконечно обрабатывать запросы — вполне валидная задача.
Сначала вы берёте List как эталонную реализацию и говорите, что Reset, Current и MoveNext могут бросать исключения когда им вздумается:
Вовсе нет. Нигде не объявлено, что Process работает с конечной коллекцией. Бесконечно обрабатывать запросы — вполне валидная задача.
MoveNext всегда возвращает bool, и не имеет при этом никаких предусловийЕщё как имеет.
IEnumerable<int> list = new List<int> { 1 };
IEnumerator<int> etor = list.GetEnumerator();
((List<int>)list).Add(2);
etor.MoveNext(); // exception
а потому что не выполняет того для чего она сделанаНу почему, реализация обещает вернуть нечто итерируемое, а не проитерированное, контракт соблюдён. Готовая последовательность строк из бд — это про
IReadOnlyCollection(Of T)/IReadOnlyList(Of T)Свойство Current с типом T не требует вызова MoveNext(), в то время как свойство Current с типом object требует:Что, кстати, по идее, ошибка реализации:
After an enumerator is created or after the Reset method is called, the MoveNext method must be called to advance the enumerator to the first element of the collection before reading the value of the Current property; otherwise, Current is undefined.MSDN
IEnumerable интерфейс в C# и LSP