I have a class called Primes and this class implements GetEnumerator() without implementing IEnumerable interface.
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
I don't get it. Am I missing something?
There's no reason that you have to implement
IEnumerable
in order to create a function calledGetEnumerator
that returns anIEnumerator
, that just means that you won't be able to supply an instance of that type to something that expects anIEnumerable
.yes you can. even you can use it in
foreach
. The only problem that objects of this class can't be cast toIEnumerable
although they implement needed method.Firstly, as others have said you can introduce your own methods without implementing interfaces anyway - you can write your own
Dispose
method without implementingIDisposable
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 withoutIEnumerable
being involved. The compiler effectively does compile-time duck typing on the namesGetEnumerator()
,Current
andMoveNext()
. 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 justIEnumerable
.an interface ensures a contract, that does not mean that you can't have a method with the same signature as one in the interface on a class that does not impliment the interface.