У меня есть следующий класс.
public class myType
{
public event Action myAction;
}
И словарь, содержащий некоторые экземпляры этого класса.
var myDictionary = new Dictionary<myType, string>();
В моем Main у меня есть метод с сигнатурой void SomeMethod(myType, Dictionary)
В следующем цикле я добавляю поведение своего объекта:
foreach(var pair in myDictionary)
pair.Key.myAction += () => SomeMethod(pair.Key, myDictionary);
После запуска этого цикла, когда вызывается действие одного из моих объектов, эффект такой, как если бы цикл использовал последнюю пару. Ключ в словаре для всех лямбда-выражений.
С другой стороны, с небольшим изменением в цикле:
foreach(var pair in myDictionary)
{
myType temp = pair.Key;
pair.Key.myAction += () => SomeMethod(temp, myDictionary);
}
После запуска этого цикла все действия объекта работают должным образом.
Я немного в недоумении, почему такое изменение могло иметь такой эффект. Пара ключ-значение может быть структурой, сам ключ является ссылочным типом (экземпляром моего класса). Есть идеи, почему это так себя ведет?
Спасибо заранее за любые предложения.