Во-первых, как уже говорили другие, вы можете в любом случае представить свои собственные методы без реализации интерфейсов - вы можете написать собственный метод Dispose
без реализации IDisposable
и т. Д. Для хорошо известных интерфейсов я бы сказал, что это почти плохо идея (поскольку у читателей будут определенные ожидания), но она полностью верна.
Что еще более важно, оператор foreach
в C # может работать без участия IEnumerable
. Компилятор эффективно выполняет утку во время компиляции на именах GetEnumerator()
, Current
и MoveNext()
. Это было сделано прежде всего для того, чтобы разрешить строго типизированную (и не боксерскую) итерацию в C # 1, перед генериками. См. Раздел 8.8.4 спецификации C # 3 для получения более подробной информации.
Однако, как правило, это плохая идея сделать это сейчас, если вы делаете хотите иметь возможность легко перебирать содержимое экземпляра как коллекции - и действительно, я бы предложил реализовать IEnumerable<T>
вместо просто IEnumerable
.