Jak wyrażenia lambda działają wewnętrznie?
Szukając odpowiedzi na to pytanie: „Dlaczego parametr out nie jest dozwolony w anonimowej metodzie?„Trochę się pogubiłem, jak działa wyrażenie lambda i anonimowe metody.
W komentarzach JaredPar stwierdza, że „Wyobraźmy sobie na przykład, że parametr out odnosi się do zmiennej lokalnej na stosie. Lambda może zostać wykonana w dowolnym dowolnym miejscu w przyszłości, a zatem może zostać wykonana, gdy ta ramka stosu nie będzie już ważna”.
Zwróciłem uwagę, czy nie byłoby tak w przypadku jakiejkolwiek innej zmiennej ... co w zasadzie powoduje, że zastanawiam się, co naprawdę muszę wiedzieć o wyrażeniach lambda.
Mam na myśli coś takiego:
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
}
W tej sytuacji tak naprawdę nie wiem, co się dzieje. obj jest referencją na stosie, która nie byłaby już ważna przy zwracaniu metody, więc metoda annonymous powinna być w stanie (jeśli to działa) faktycznie wiedzieć, że jest to typ odniesienia i skopiować referencję zamiast wartości, jeśli to robi ... dlaczego ref params nie działa, jeśli „przypadek użycia” jest mniej więcej taki sam?