Laden...

Verwirrendes Verhalten bei Erzeugung von Delegates in einer Itteration

Erstellt von Christoph K. vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.069 Views
Christoph K. Themenstarter:in
821 Beiträge seit 2009
vor 12 Jahren
Verwirrendes Verhalten bei Erzeugung von Delegates in einer Itteration

Hallo Leute,

ich habe folgenden Code

 foreach (BusinessElementMetadata metadata in metadataOfBusinessElements.ToList())
            {
                var metadatalocal = metadata;
                var menuItem = new ContextMenuItemViewModel(metadata.Name, () => ShoIt(metadatalocal.Id));
                var menuItem2 = new ContextMenuItemViewModel(metadata.Name + "2", () => ShoIt(metadata.Id));
                newBusinessElementEntry.SubEntries.Add(menuItem);
                newBusinessElementEntry.SubEntries.Add(menuItem2);
            }

Wie ihr seht eurzeuge ich in einer Itteration Context-Menü eintärge, letzendlich auf Action-Delegates zurückgeführt werden.
Das Verhalten was ich nun festgestellt habe ist, dass die Contextmenüeinträge die mit

var menuItem2 = new ContextMenuItemViewModel(metadata.Name + "2", () => ShoIt(metadata.Id));

erzeugt werden alle den selben werden als "metadata.Id" haben, währen die Menüeinträge die mit

var menuItem = new ContextMenuItemViewModel(metadata.Name, () => ShoIt(metadatalocal.Id));

erzeugt werden unterschiedliche einträge für die Id haben. Der einzige unterschied ist, dass ich beim zweiten mal, die Itterationvariable "metadata" noch einmal temporär umlege.

Kann mir jemand dieses Verhalten erklären?

M
1.439 Beiträge seit 2005
vor 12 Jahren
49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Christoph K.,

marsgk hat schon das richtige Stichwort geliefert. Deshalb hier nur eine ganz kurze Ergänzung:

Die unmittelbare Ursache für das unterschiedliche Verhalten ist der unterschiedliche Scope in dem die Variablen jeweils deklariert sind. Wenn du beide Variablen innerhalb oder beide Variablen außerhalb der Schleife deklarierst, werden beide Codezeilen das gleiche Verhalten zeigen.

herbivore