Dies kommt von dem Lambda-Ausdruck; i
wird geteilt alle von ihnen . Zu dem Zeitpunkt, zu dem die Funktion ausgeführt wird, werden sie im Wesentlichen wie timers[i].Tick += (sender, e) => Tick(targs[5])
aufgerufen.
Um dies zu vermeiden, erstellen Sie eine lokal begrenzte Variable ( int locali = i
) und verwenden Sie diese stattdessen in Ihrer Zeile. Dadurch wird sichergestellt, dass jeder Lambda-Ausdruck tatsächlich den erwarteten Wert erhält.
i
wird 5 aus der letzten Iteration Ihrer Schleife vor dem Beenden. Natürlich haben Sie kein targs[5]
-Element, also wirft es ein IndexOutOfRangeException
.
Technisch gesehen müssen Sie locali
nicht für den timers[i].Tick
-Teil verwenden, da es sofort ausgewertet wird, aber ich persönlich finde es verwirrend, die beiden zu mischen.
Einige zusätzliche Lektüre zum Thema:
Die foreach-Kennung und die Sperrungen
Schließen über die Schleifenvariable als schädlich angesehen
Tags und Links c# winforms event-handling