Где найти старый компилятор для C# 4.0
Я хочу сказать, что в C# замыкание делается на переменную, а не на значение этой переменной в момент создания замыкания.
Так понятнее?
вроде бы стало понятнее, т.е. "замыкание со ссылками", т.е.
int i = 1; actions.Add(() => Console.WriteLine(i)); i = 2; // печатаем
выдаст нам не 1 а 2 (хотя не ссответствует коду Closure из статьи на хабре).
Но тут вы меня опять смутили:
Для ссылочных типов там, понятно, ссылка хранится. Для значимых типов - значение.
Это как? Ссылка, хранимая в переменной "x" ссылочного типа и есть её значение. "замыкание со ссылками" будет хранить ссылку на переменную "x" а не ссылку, хранившуюся в "x" в момент создания closure. Получается в моём примере выше, шарп должен выдать 1, ведь при создании closure он соханил в нём для значимого типа его значение "1"?
Вот этот пример как раз отлично это иллюстрирует:
Не совсем отлично. Тут или шарп создал одно-единственное closure для обеих лямбд (вторая экшен это та же первая), и при инициализации для 2-го action переписал значение i (замыкание со значениями), или он создал два closure но со ссылками на i (замыкание со ссылками).