VS2022调试器在不同作用域同名变量处异常的原因排查
VS2022调试器同名变量Null引用异常成因解析
这是VS2022调试器的符号跟踪逻辑bug,具体成因如下:
- 从C#语法规则看,
if和else if块属于独立的局部作用域,两个同名的parts变量是完全独立的实体,编译器会生成正确的IL代码,所以程序运行本身没有问题。 - 但VS调试器在处理这类跨分支的同名变量时,错误地将它们映射为同一个调试符号。当程序进入
else if块时,调试器会尝试读取之前if块中变量的调试信息——但if块因条件不成立从未执行,对应变量的内存根本没初始化,因此调试器读取时就会抛出Null引用异常。 - 重命名
else if块中的变量后,调试器会为新变量创建独立的调试符号,不会复用未初始化的旧变量信息,自然就能正常显示变量内容。
示例代码:
public class Test { public string part1 { get; set; } public string part2 { get; set; } } List<Test> test = new List<Test>(); test.Add(new Test(){ part1 = "asad", part2 = "asdasd"}); test.Add(new Test(){ part1 = "asad", part2 = "asdasd"}); test.Add(new Test(){ part1 = "asad", part2 = "asdasd"}); bool check1 = false; bool check2 = true; if(check1) { var parts = test.Where(x => x.part1.StartsWith("a")); } else if(check2) { var parts = test.Where(x => x.part1.StartsWith("a")); }
内容的提问来源于stack exchange,提问作者TK-421
相关产品推荐
相关产品推荐

