Sto facendo del mio meglio per codificare le interfacce quando possibile, ma sto riscontrando alcuni problemi quando si tratta di raccolte. Ad esempio, ecco un paio di interfacce che vorrei usare.L'implementazione esplicita di GetEnumerator dell'interfaccia causa l'overflow dello stack
public interface IThing {}
public interface IThings : IEnumerable<IThing> {}
Ecco le implementazioni. Per implementare IEnumerable <IThing>, è necessario implementare esplicitamente IEnumerable <IThing> .GetEnumerator() in Oggetti.
public class Thing : IThing {}
public class Things : List<Thing>, IThings
{
IEnumerator<IThing> IEnumerable<IThing>.GetEnumerator()
{
// This calls itself over and over
return this.Cast<IThing>().GetEnumerator();
}
}
Il problema è che l'implementazione di GetEnumerator causa uno stack overflow. Si chiama più e più volte. Non riesco a capire perché avrebbe deciso di chiamare quell'implementazione di GetEnumerator invece dell'implementazione fornita dal risultato di questo.Cast <IThing>(). Qualche idea su cosa sto facendo male? Sono pronto a scommettere che sia qualcosa di estremamente stupido ...
Ecco qualche semplice codice di prova per le classi di cui sopra:
static void Enumerate(IThings things)
{
foreach (IThing thing in things)
{
Console.WriteLine("You'll never get here.");
}
}
static void Main()
{
Things things = new Things();
things.Add(new Thing());
Enumerate(things);
}
Oooh, buona scelta. Questo rende ovvio che base.GetEnumerator() dovrebbe funzionare, se comprendeva covarianza e contravaraince come diceva Frank. Ma dal momento che non lo fa, questo fa abbastanza bene il trucco! – Joe
sì, C# 4 sarà fantastico:^p inoltre, sono rimasto sorpreso che "((Lista) questo). Rapido () .GetEnumerator();" non ha funzionato neanche: s –
Stormenet
Dopo aver guardato Reflector, è ovvio perché Cast non funziona. Fondamentalmente, lancia solo ciascuno degli elementi individualmente, se necessario. In questo caso vede che "questo" è un oggetto IEnumerable, quindi restituisce solo questo. È troppo intelligente per il suo bene. :) –
Joe