2009-10-28 17 views
7

Al buscar la respuesta a esta pregunta: "Why is an out parameter not allowed within an anonymous method?" Estoy un poco perdido sobre cómo funcionan realmente la expresión lambda y los métodos anónimos.¿Cómo funcionan las expresiones lambda internamente?

En los comentarios JaredPar afirma que "Imagine por ejemplo que el parámetro out se refiere 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 ese marco de 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é sobre 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 no se sabe muy bien lo que está pasando. obj es una referencia en la pila que ya no sería válida en el retorno del método, por lo que el método anónimo debería ser capaz (si eso funciona) de saber realmente que es un tipo de referencia y copiar la referencia en lugar del valor, si lo hace ... ¿Por qué no funcionarían los ref parámetros si el "caso de uso" es más o menos el mismo?

Respuesta

6

Jon Skeet escribió un in-depth description.

Básicamente, el compilador convierte el método externo en una clase y convierte todas las variables a las que acceden los métodos anónimos en campos de la clase. Los métodos anónimos se convierten en métodos de instancias regulares en la clase.

Cuestiones relacionadas