【发布时间】:2017-03-15 01:41:30
【问题描述】:
我想调试在表达式树中调用的 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 处中断。
看body的调试视图我看到了:
.Block(System.Int32 $result) {
$result = $x + 1;
.Call System.Console.WriteLine($result)
}
表示复制语义:lambda 的逻辑已“内联”,我想与原始 lambda 的连接丢失了。或者是否有任何技巧可以在 Visual Studio 中调试原始 lambda?
【问题讨论】:
-
由于您的新 lambda 不直接调用原始 lambda,我不明白您如何在一个将转移到另一个的断点上放置一个断点。
标签: c# linq-expressions