Trotz der Tatsache, dass IEnumerator.Reset
method should never be used Ich seltsames Verhalten der Methode Implementierung innerhalb List<T>
gefunden.Liste <T> .Enumerator IEnumerator.Reset() Methode Implementierung
Egal, wie Sie .NET Framework-Quellcode untersuchen (versucht, mit Referenzquelle und ILSpy) wird das Verfahren implementiert, wie folgend:
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
aber es sieht aus wie das Verfahren überhaupt nicht genannt wird! Betrachten Sie den Code:
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);
}
Es ist ziemlich klar,, dass es True
und 3
zweimal gedruckt werden soll. Stattdessen ist das Ergebnis
True
3
False
0
Jede einfache Erklärung, die ich vermisse?
stellte sich heraus, ein neues Beispiel dafür, warum wandelbar structs böse sind. Veränderliche Strukturen, bei denen die Mutation durch eine explizite Schnittstellenimplementierung geschieht, sind nur ein kleines Extra-Übel. Diese verschachtelten'Enumerator'-Strukturen werden normalerweise nur vom C# -Compiler verwendet, wenn sie eine 'foreach'-Anweisung übersetzen. –