При поиске ответа на этот вопрос: " Почему параметр out запрещен в анонимном методе? " Я немного растерялся из-за того, как на самом деле работают лямбда-выражения и анонимные методы.
В комментариях JaredPar заявляет, что «Представьте, например, что параметр out ссылается на локальную переменную в стеке. Лямбда может выполняться в любой произвольной точке в будущем и, следовательно, может выполняться, когда этот кадр стека больше не действителен» .
Я указал, не будет ли это так с любой другой переменной ... которая в основном заставляет меня задаться вопросом, что я действительно знаю о лямбда-выражениях.
Я имею в виду нечто подобное:
public void Foo(ComplexObject val, out SomeDelegate outDelegate)
{
ComplexObject obj = new ComplexObject(val)
SomeDelegate = delegate(int other) { return (obj.value * other); }
}
public void Bar()
{
SomeDelegate MyDel = null;
Foo(5, out MyDel);
int finalRes = MyDel(100);
// Whatever
}
В этой ситуации я действительно не знаю, что происходит. obj - это ссылка на стек, которая больше не будет действительной при возврате метода, поэтому анонимный метод должен иметь возможность (если это работает) фактически узнать, что это ссылочный тип, и скопировать ссылку вместо значения, если это так ... почему ref params не сработает, если «прецедент» более или менее одинаков?