假设您的意思是“作为委托”,那么它仍然取决于 :p 如果它捕获任何变量(包括“this”,这可能是隐式的),那么这些变量实际上被实现为编译器生成的类型上的字段(不公开在任何地方) ),并且语句主体成为该捕获类上的方法。如果存在多个捕获级别,则外部捕获又是内部捕获类上的字段。但本质上:
int i = ...
Func<int,int> func = x => 2*x*i;
Is like;
var capture = new SecretType();
capture.i = ...
Func<int,int> func = capture.SecretMethod;
Where:
class SecretType {
public int i;
public int SecretMethod(int x) { return 2*x*i; }
}
这与“匿名方法”相同,但语法不同。
请注意,不捕获状态的方法可以实现为没有捕获类的静态方法。
另一方面,表达式树...解释起来比较棘手:p
但是(我手头没有编译器,所以请耐心等待):
int i = ...
Expression<Func<int,int>> func = x => 2*x*i;
是这样的:
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);
(除了使用不存在的“memberof”构造,因为编译器可以作弊)
表达式树很复杂,但可以解构和检查 - 例如转换为 TSQL。