通常,在编译表达式树时,我会想到不是基元类型或字符串的常量是不可能的 . 但是,这段代码:
public class A
{ public int mint = -1; }
public static void Main(String[] pArgs)
{
//Run(pArgs);
Action pact = Thing();
pact();
}
public static Action Thing()
{
var a = new A();
a.mint = -1;
LambdaExpression p =
Expression.Lambda(Expression.Assign(Expression.Field(Expression.Constant(a, typeof(A)), Strong.Instance.Field(b => b.mint)), Expression.Constant(3, typeof(int))));
return ((Expression)p).Compile();
}
不仅编译,而且实际运行!如果在Thing()方法中运行已编译的方法,那么实际上可以看到变量a将其字段从-1更改为3
我不明白这是否有意义/是可能的 . 方法如何引用其范围之外的局部变量(当检查Thing()的IL时,变量a只是一个标准的局部变量,而不是像堆上的那样在堆上) . 周围是否有某种隐藏的背景?当局部变量a可能已从堆栈中移除时,如何在Main中运行pact!