调试时字符串插值触发NullReferenceException异常问题
更新的更新(这情况越来越离谱了)
我现在完全懵了。我注意到之前的更新里第7行的{b}后少了个句号,于是为了准确我补上了它。
!!!现在第7行单步执行时也会失败了!!!
这到底是怎么回事???
现在的Program.cs出现了更诡异的结果……
try { var a = "a"; var b = "b"; var r1 = "r"; var r1x = $"r2x1={a}.{b}.{r1}"; // < Line 6 - 在此处按F10会触发异常 var r1y = $"r2x1={a}.{b}" + r1; // < Line 7 - 在此处按F10可正常执行! var r1z = $"r2x1={a}.{b}." + r1; // < Line 8 - 在此处按F10会触发异常!!! var r1a = $"r2x1={a}.{b}{r1}"; // < Line 9 - 在此处按F10会触发异常 Console.WriteLine(r1x); } catch (NullReferenceException e) { Console.WriteLine(e); }
更新内容
我进一步测试后发现,问题似乎与字符串插值直接相关。在下方更新后的Program.cs中,给第6行(var r1x = ...)加断点,按F10单步执行会触发异常,但按F5直接运行则无异常。不过如果同时给第7行(var r1y = ...)加断点,按F10单步执行却能正常通过!
try { var a = "a"; var b = "b"; var r1 = "r"; var r1x = $"r2x1={a}.{b}.{r1}"; // < Line 6 - 在此处按F10会触发异常 var r1y = $"r2x1={a}.{b}" + r1; // < Line 7 - 在此处按F10可正常执行! Console.WriteLine(r1x); } catch (NullReferenceException e) { Console.WriteLine(e); }
原始问题
Program.cs代码如下:
try { var a = "a"; var b = "b"; var r1 = "r"; var r2 = "r"; r1 = $"r1={a}.{b}.{r1}"; r2 = $"r2={a}.{b}.{r2}"; Console.WriteLine(r1); Console.WriteLine(r2); } catch (NullReferenceException e) { Console.WriteLine(e.StackTrace); }
这段简单的代码在不使用调试器逐行单步执行时运行完全正常。
但如果在第8行(r2 = ...)设置断点,单步执行时会进入catch块,抛出NullReferenceException,异常栈信息如下:
System.NullReferenceException: Object reference not set to an instance of an object. at System.Buffer.Memmove(Byte& dest, Byte& src, UIntPtr len) at System.Runtime.CompilerServices.DefaultInterpolatedStringHandler.AppendStringDirect(String value) at Program.<Main>$(String[] args) in /Users/rambler/tmp/Four Weeks/why/ConsoleApp1/Program.cs:line 8
同样,在第7行设置断点也会出现相同异常。但如果不在这两行设置断点,代码就能无异常运行。
我尝试了r1 = ...和r2 = ...的多种写法,部分写法在插值中使用r1(或r2),结果难以捉摸。
但无论哪种情况,只要不调试特定行,代码就能正常运行。
目前我在Mac上的Rider和Visual Studio Code中都复现了该问题,之后会在Windows上测试是否能复现。
这个问题是在我开发一个大型应用时发现的,最终将问题范围缩小到上述代码。
.NET版本:7.0.203
内容的提问来源于stack exchange,提问作者Rachel Ambler
相关产品推荐
相关产品推荐

