使用以下代码作为示例:
if (true)
{
string foo = null;
List<string> bar = new List<string>
{
"test"
};
bar.Any(t => t == foo);
}
如果我以常规方式运行此程序(没有断点或任何其他中断),一切都可以正常运行,无异常或错误(正如您所期望的那样)。
现在,如果我在if语句上放置一个断点并将光标移动到大括号,如下图所示(使用我的鼠标,不使用F10,所以跳过if(true)
语句):
当调试器执行语句System.NullReferenceException
时,我得到类型string foo = null
的异常
似乎与foo
语句中的lambda表达式中使用变量if
的事实有关。我已经在Visual Studio 2012和2013(专业版和终极版)上测试并重现了这一点。
有关为何会发生这种情况的任何想法吗?
答案 0 :(得分:9)
猜测你正在跳过封闭生成的评论是正确的。移动指令指针时,不保证C#程序具有任何特定行为。如果你这样做会伤害,不要这样做。
实际上这是一个小谎言。有保证。例如,您可以保证在可验证的程序中这样做不会破坏clr的内部数据结构。您可以保证这样做不会使堆栈错位。等等。但是,您的数据结构不能表达或暗示任何保证!您将指令指针移动到危险之中。