2016-06-19 16 views
0

ich diesen Code habe:# Ereignis C kann nicht anonyme Methode mit dem richtigen Argumente Wert nennt

for (int i = 0; i < 7; ++i) 
    Roption.DropDownItems.Add(string.Concat("Item &", i), null, delegate { Reset(i); }); 

wo Reset() aufgerufen wird, wenn das Drop-down-Element geklickt wird.

Das Problem ist, dass, egal welcher Auswahlpunkt geklickt wird, das Argument weitergegeben wird Reset 7 (der Wert von i nachdem die Schleife endet), nicht der Wert, wenn die iRoption.DropDownItems.Add Funktion aufgerufen wird. Was verursacht dieses Verhalten und wie kann es behoben werden? (Ich möchte in sieben ansonsten identischen Aussagen nicht wirklich hart 0 bis 6 kodieren).

+1

Erstellen Sie eine Kopie der Variable 'I' wie dieses' i1 = I' und übergeben 'i1' Methode anstelle zurücksetzen ... http://stackoverflow.com/questions/271440/captured-variable -in-a-loop-in-c-shar –

+0

Das funktioniert, danke! – limits

Antwort

2

Ihr Problem hier ist, dass beim Erstellen der Delegaten in einer Schleife alle Objekte als Referenz übergeben werden. Dies bedeutet, dass sie unabhängig davon, ob es sich um Werttyp- oder Referenztyp-Objekte handelt, immer noch als Referenz übergeben werden.

Was bedeutet das für Ihren Code? Nun, während die Schleife durchläuft, haben alle Reset Methodenaufrufe, die eine Kopie von i haben, einen Verweis auf den gleichen. Wenn der Wert von i ansteigt, erhöht sich der Wert für jede einzelne Referenz.

Closures Explained