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?

questionAnswers(2)

yourAnswerToTheQuestion