- Ich habe eine generische Klasse A < T>, die IEnumerable < T implementiert []>.
Ich möchte eine Bequemlichkeit Wrapper B haben, die von A < char erbt> und implementiert IEnumerable < String>.Multiple IEnumerable Implementierungen Paradox
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(); } }
Jetzt funktioniert das völlig in Ordnung, Variablentyp foreach wird gefolgert String sein:
B b = new B();
foreach (var s in b)
{
string[] split = s.Split(' ');
}
Aber dies wird nicht kompiliert, sagen: „Die Art Argumente können nicht von der Nutzung geschlossen werden , versuchen Sie die Typargumente explizit "festgelegt wird:
string[] strings = b.ToArray();
dies funktioniert jedoch:
string[] strings = b.ToArray<string>();
Kann jemand dieses Compilerverhalten erklären?
Offensichtlich implementiert B beide IEnumerable < char []> und IEnumerable < String> und wahrscheinlich kann es nicht herausfinden, wer von ihnen ich anrufen will, aber warum es funktioniert gut in „foreach“ Probe ?
Bitte, schlagen Sie mir nicht vor, mein Problem durch Komposition zu lösen - das ist der letzte Ausweg für mich.