2011-05-02 14 views
17

No entiendo lo que está sucediendo aquí:¿Cómo se convierte implícitamente un Func <T> a la Expresión <Func<T>>?

Ambas líneas de compilación:

Func<object> func =() => new object(); 

Expression<Func<object>> expression =()=>new object(); 

pero esto no significa:

expression = func; 

no hay un operador implícita en LambdaExpression o Expression<TDelegate> que convierte un delegado en la expresión, por lo que debe estar sucediendo algo más para que la asignación funcione. ¿Qué es?

Respuesta

28

No es una conversión implícita en el sentido habitual: es un truco de compilación. El compilador detecta cuál se espera del contexto y luego lo compila como un delegado (un método oculto en su clase) o como una expresión (un fragmento de código que construye la expresión llamando a los métodos en System.Linq.Expressions.Expression).

Esta es la razón por la que no se puede asignar directamente una expresión lambda a una variable de tipo object o var, entre otras cosas, porque el compilador tiene que ser capaz de saber si nos referimos a un delegado o una expresión.

+1

Más [aquí] (http://msdn.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic20). –

+1

+1 para la explicación del objeto de apoyo y var. –

+5

Como último, además, tendría que decidir * qué tipo de delegado * (o expresión-de-tipo-delegado) usar; no hay nada especial sobre 'Func <...>' etc. –

Cuestiones relacionadas