调试器步进if语句和lambda表达式

时间:2014-06-13 23:32:23

标签: c# lambda visual-studio-debugging

使用以下代码作为示例:

if (true)
{
    string foo = null;
    List<string> bar = new List<string>
    {
        "test"
    };
    bar.Any(t => t == foo);
}

如果我以常规方式运行此程序(没有断点或任何其他中断),一切都可以正常运行,无异常或错误(正如您所期望的那样)。

现在,如果我在if语句上放置一个断点并将光标移动到大括号,如下图所示(使用我的鼠标,不使用F10,所以跳过if(true)语句):

enter image description here

当调试器执行语句System.NullReferenceException时,我得到类型string foo = null的异常

似乎与foo语句中的lambda表达式中使用变量if的事实有关。我已经在Visual Studio 2012和2013(专业版和终极版)上测试并重现了这一点。

有关为何会发生这种情况的任何想法吗?

1 个答案:

答案 0 :(得分:9)

猜测你正在跳过封闭生成的评论是正确的。移动指令指针时,不保证C#程序具有任何特定行为。如果你这样做会伤害,不要这样做。

实际上这是一个小谎言。有保证。例如,您可以保证在可验证的程序中这样做不会破坏clr的内部数据结构。您可以保证这样做不会使堆栈错位。等等。但是,您的数据结构不能表达或暗示任何保证!您将指令指针移动到危险之中。