Firstly, as others have said you can introduce your own methods without implementing interfaces anyway - you can write your own Dispose
method without implementing IDisposable
etc. For well-known interfaces I'd suggest this is almost a bad idea (as readers will have certain expectations) but it's entirely valid.
More importantly though, the foreach
statement in C# can work without IEnumerable
being involved. The compiler effectively does compile-time duck typing on the names GetEnumerator()
, Current
and MoveNext()
. This was primarily to allow strongly-typed (and non-boxing) iteration in C# 1, before generics. See section 8.8.4 of the C# 3 spec for more details.
However, it's generally a bad idea to do this now if you do want to be able to easily iterate over the contents of an instance as a collection - and indeed I'd suggest implementing IEnumerable<T>
instead of just IEnumerable
.