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?
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