I want to have a convenience wrapper B that inherits from A<c
The difference is the following:
foreach
actually looks for a public method called GetEnumerator
. It doesn't really care for IEnumerable<T>
. Your class B
only has one public method named GetEnumerator
: The one defined in B
which hides the one defined in A
.
ToArray
on the other hand is an extension method on IEnumerable<T>
. As your class is both IEnumerable<string>
and IEnumerable<char[]>
the call is ambiguous between the two generic arguments string
and char[]
.
foreach
loop does not use IEnumerable
or IEnumerable<T>
implementation. You can use foreach
even if your class doesn't implement any of them. The only thing it needs is GetEnumerator
method that returns IEnumerator
implementation.
Check this question: How is foreach implemented in C#?
That's why your class works with foreach
and doesn't with ToArray()
.