Warum wirft ControlCollection keine InvalidOperationException?

8

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 .

Ссылка

    
Meirion Hughes 29.01.2016, 12:21
quelle

1 Antwort

5

Die Antwort dazu finden Sie in der Referenz Quelle für ControlCollectionEnumerator

%Vor%

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).

    
Matthew Watson 29.01.2016, 12:49
quelle

Tags und Links