Настоящий ключ - помнить, что область видимости является лексической; это то, о чем заботится компилятор. Таким образом, он фиксирует переменные , а не их значения . Являются ли эти значения типами значений или ссылочными типами, это совершенно другой вопрос.
Может быть, поможет немного более экстремальный пример изменения поведения делегата:
var myVariable = "something";
Action a = () => Console.WriteLine(myVariable);
myVariable = "something else entirely"
a();
печатает "что-то еще целиком". В этом свете не имеет значения, сколько раз вы оборачиваете, сохраняете или перемещаете функцию; он по-прежнему ссылается на переменную, которую он вложил. Итак, вкратце, значение имеет значение вложенной переменной, когда делегат фактически выполняется.