我希望能够调试一个被表达式树调用的lambda函数。不幸的是,断点永远没有被触发。
以下是可以使用的完整控制台程序:
private static void Main()
{
var evalAndWrite = EvalAndWrite(x => x + 1 /* a breakpoint here is never hit */);
evalAndWrite(1);
Console.ReadLine();
}
private static Action<int> EvalAndWrite(Expression<Func<int, int>> expr)
{
var result = Expression.Variable(typeof(int), "result");
var assign = Expression.Assign(result, expr.Body);
var writeLine = Expression.Call(typeof(Console), nameof(Console.WriteLine), null, result);
var body = Expression.Block(new[] {result}, assign, writeLine);
return Expression.Lambda<Action<int>>(body, expr.Parameters[0]).Compile();
}
如果我在lambda内部(即在使用F9的
x + 1
处)设置断点,则整行会被断点中断,但实际执行lambda时不会中断lambda。查看body
的调试视图,我看到:.Block(System.Int32 $result) {
$result = $x + 1;
.Call System.Console.WriteLine($result)
}
这段话表明代码使用了复制语义:lambda函数的逻辑已经“内联”,我认为与原始lambda之间的连接已经丢失了。或者是否有任何诀窍可以使在Visual Studio中调试原始lambda成为可能?