Implementacja metody List <T> .Enumerator IEnumerator.Reset ()
Pomimo tego, żeIEnumerator.Reset
nigdy nie należy stosować metody Znalazłem dziwne zachowanie podczas implementacji metodyList<T>
.
Bez względu na to, jak będziesz badać kod źródłowy .NET Framework (wypróbowany ze źródłem odniesienia i ILSpy), metoda jest implementowana w następujący sposób:
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
Wygląda jednak na to, że metoda nigdy nie jest wywoływana! Rozważ kod:
var list = new List<int>(1) { 3 };
using (var e = list.GetEnumerator())
{
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
((IEnumerator)e).Reset();
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
}
Jest całkiem jasne, że powinien wydrukowaćTrue
i3
dwa razy. Zamiast tego wynik jest
True
3
False
0
Jakieś proste wyjaśnienie, którego mi brakuje?