- mam ogólne klasy A nie < T>, który implementuje IEnumerable < T []>.
chcę mieć wygodę otoki B, która dziedziczy A < char> i wdraża IEnumerable < ciąg>.IEnumerable 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(); } }
Teraz to działa perfekcyjnie, foreach typ zmiennej jest wywnioskować być ciąg:
B b = new B();
foreach (var s in b)
{
string[] split = s.Split(' ');
}
Ale nie będzie to skompilować, mówiąc: „Argumenty typu nie można wywnioskować z użytkowania , spróbuj podać argumenty typu jawnie ":
string[] strings = b.ToArray();
jednak to działa:
string[] strings = b.ToArray<string>();
Czy ktoś może wyjaśnić zachowanie kompilatora?
Oczywiście, B realizuje oba IEnumerable < char []> i IEnumerable < ciąg> i prawdopodobnie nie może dowiedzieć się, który z nich chcę zadzwonić, ale dlaczego to działa dobrze w „foreach” próbki ?
Proszę, nie sugeruj mi, żebym rozwiązał mój problem przez kompozycję - to dla mnie ostatnia deska ratunku.