¿Cómo funcionan las expresiones lambda internamente?

Mientras buscaba la respuesta a esta pregunta: "¿Por qué no se permite un parámetro de salida dentro de un método anónimo?"Me he perdido un poco sobre cómo funcionan realmente la expresión lambda y los métodos anónimos.

En los comentarios, JaredPar afirma que "Imagine, por ejemplo, que el parámetro out se refirió a una variable local en la pila. La lambda puede ejecutarse en cualquier punto arbitrario en el futuro y, por lo tanto, podría ejecutarse cuando el marco de la pila ya no sea válido".

Señalé si ese no sería el caso con cualquier otra variable ... lo que básicamente me hace preguntarme qué es lo que realmente sé acerca de las expresiones lambda.

Lo que tengo en mente es algo como esto:

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
}

En esa situación realmente no sé qué está pasando. obj es una referencia en la pila que ya no sería válida en la devolución del método, por lo que el método anónimo debería (si funciona) saber realmente que es un tipo de referencia y copiar la referencia en lugar del valor, si lo hace ... ¿por qué no funcionaría ref params si el "caso de uso" es más o menos el mismo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta