В С# 7.0 вы можете объявлять локальные функции, т.е. функции, живущие внутри другого метода. Эти локальные функции могут обращаться к локальным переменным окружающего метода. Поскольку локальные переменные существуют только во время вызова метода, я задавался вопросом, можно ли назначить локальную функцию для делегата (который может жить дольше, чем этот вызов метода).
public static Func<int,int> AssignLocalFunctionToDelegate()
{
int factor;
// Local function
int Triple(int x) => factor * x;
factor = 3;
return Triple;
}
public static void CallTriple()
{
var func = AssignLocalFunctionToDelegate();
int result = func(10);
Console.WriteLine(result); // ==> 30
}
Это действительно работает!
Мой вопрос: почему это работает? Что здесь происходит?