Im Anschluss an diese Frage Foreach-Schleife für die Entsorgung Kontrollen Überspringen Iterationen < Es störte mich, dass die Iteration über eine sich verändernde Sammlung erlaubt war:
Zum Beispiel:
%Vor%wirft
InvalidOperationException: Die Sammlung wurde geändert. Aufzählungsoperation kann nicht ausgeführt werden.
In einem .Net-Formular können Sie jedoch Folgendes tun:
%Vor%, welche Elemente überspringt, weil das der Iterator über eine sich verändernde Sammlung läuft, ohne eine Ausnahme zu werfen
Fehler? sind nicht Iteratoren erforderlich, um InvalidOperationException
zu werfen, wenn sich die darunterliegende Sammlung ändert?
Also meine Frage ist Warum Iteration über einen Wechsel ControlCollection
NICHT InvalidOperationException werfen?
Nachtrag:
Die Dokumentation für IEnumerator
sagt:
Der Enumerator hat keinen exklusiven Zugriff auf die Sammlung. Daher ist das Aufzählen durch eine Sammlung an sich kein Thread-sicheres Verfahren. Auch wenn eine Sammlung synchronisiert wird, können andere Threads die Auflistung weiterhin ändern, wodurch der Enumerator eine Ausnahme auslöst .
Die Antwort dazu finden Sie in der Referenz Quelle für ControlCollectionEnumerator
Achten Sie besonders auf die Kommentare in MoveNext()
, die explizit darauf eingehen.
IMO dies ist ein fehlgeleitetes "Fix", weil es einen offensichtlichen Fehler maskiert, indem es einen subtilen einführt (Elemente werden stillschweigend übersprungen, wie vom OP bemerkt).