Suponiendo que quiere decir "como delegado", entonces todavía depende: p si captura cualquier variable (incluyendo "este", que puede estar implícito), entonces esas variables son en realidad implementados como campos en un tipo generado por el compilador (no expuesto en ningún lugar público), y el cuerpo de la declaración se convierte en un método en esa clase de captura. Si hay múltiples niveles de captura, la captura externa es nuevamente un campo en la clase de captura interna. Pero esencialmente:
int i = ...
Func<int,int> func = x => 2*x*i;
Es como;
var capture = new SecretType();
capture.i = ...
Func<int,int> func = capture.SecretMethod;
Donde:
class SecretType {
public int i;
public int SecretMethod(int x) { return 2*x*i; }
}
Esto es idéntico a "métodos anónimos", pero con diferente sintaxis.
Tenga en cuenta que los métodos que no capturan el estado pueden implementarse como métodos estáticos sin una clase de captura.
árboles de expresión, por otro lado ... son más difíciles de explicar: p
Pero (no tengo un compilador a mano, así que tengan paciencia conmigo):
int i = ...
Expression<Func<int,int>> func = x => 2*x*i;
Es algo así como:
var capture = new SecretType();
capture.i = ...
var p = Expression.Parameter("x", typeof(int));
Expression<Func<int,int>> func = Expression.Lambda<Func<int,int>>(
Expression.Multiply(
Expression.Multiply(Expression.Constant(2),p),
Expression.PropertyOrField(Expression.Constant(capture), "i")
), p);
(excepto el uso de la inexistente "memberof" construir, ya que el compilador puede engañar)
Los árboles de expresión son complejos, pero se pueden deconstruir e inspeccionar, por ejemplo, para traducir a TSQL.
En realidad, hay dos implementaciones completamente diferentes: ¿es un delegado? ¿O un árbol de expresión? –
Probablemente un árbol de expresiones es lo que busco aquí: (x) => x.ToString() algo así. Supongo que un delegado es en realidad una instancia de un tipo debido a + = y lo que no. – lucidquiet
@lucidquier la sintaxis es idéntica; usted no puede decir lo que es a menos que sepa el tipo de asignación o tipo de parámetro. –