c# - Multiple IEnumerable implementations paradox -


  1. i have generic class a<t>, implements ienumerable<t[]>.
  2. i want have convenience wrapper b inherits a<char> , implements ienumerable<string>.

    public class a<t> : ienumerable<t[]> {     public ienumerator<t[]> getenumerator()     {         return enumerate().getenumerator();     }      ienumerator ienumerable.getenumerator()     {         return getenumerator();     }      protected ienumerable<t[]> enumerate()     {         throw new system.notimplementedexception();     } }  public class b : a<char>, ienumerable<string> {     public ienumerator<string> getenumerator()     {         return enumerate().select(s => new string(s)).getenumerator();     }      ienumerator ienumerable.getenumerator()     {         return getenumerator();     } } 

now, works fine, foreach variable type inferred string:

b b = new b(); foreach (var s in b) {     string[] split = s.split(' '); } 

but won't compile, saying "the type arguments cannot inferred usage, try specifying type arguments explicitly":

string[] strings = b.toarray(); 

however, works:

string[] strings = b.toarray<string>(); 

can explain compiler behavior?

obviously, b implements both ienumerable<char[]> , ienumerable<string> , can't figure out of them want call, why works fine in "foreach" sample?

please, don't suggest me solve problem composition - last resort me.

the difference following:

foreach looks public method called getenumerator. doesn't care ienumerable<t>. class b has 1 public method named getenumerator: 1 defined in b hides 1 defined in a.

toarray on other hand extension method on ienumerable<t>. class both ienumerable<string> , ienumerable<char[]> call ambiguous between 2 generic arguments string , char[].


Comments