Seguendo due metodi (uno usa IEnumerator<int>
e altri usi List<int>.Enumerator
) anche se sembra identico produce risultati diversi.Comportamento del metodo di ripristino dell'elenco <T> .Enumeratore
static void M1()
{
var list = new List<int>() { 1, 2, 3, 4 };
IEnumerator<int> iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
iterator.Reset();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
}
static void M2()
{
var list = new List<int>() { 1, 2, 3, 4 };
//Here the iterator will be List<int>.Enumerator (which is a struct)
var iterator = list.GetEnumerator();
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
//This will not work, as Reset method was implemented explicitly
//iterator.Reset();
//So casting it to IEnumerator is required
//which will lead to boxing and other issues of struct and interface
((IEnumerator<int>)iterator).Reset();
//Following loop will NOT work
while (iterator.MoveNext())
{
Console.Write(iterator.Current);
}
}
Ci sono un paio di domande che spiega chiaramente questo comportamento, li here, here, e here si può controllare.
ho ancora seguendo due dubbi
- Perché List.Enumerator non getta "NotSupportedException" per Reset?
- Perché Reset è stato implementato in modo esplicito e non implicitamente come MoveNext e Current?
Non dovrebbe questo ultimo commento dire "Il ciclo seguente non funzionerà"? Oppure potrebbe essere più illustrativo se dicesse "Il ciclo seguente viene saltato senza eseguire". – JLRishe
@JLRishe - Sì, l'ho perso, corretto ora. Grazie. –