代码在 .Net 5 中运行正常,但在 .Net 6 中无法运行。

4

我已通过Visual Studio反馈工具报告了此可能的错误,但我有以下示例代码,在.Net 5中运行,但在.Net 6中无法正确工作,我觉得这要么是一个bug,要么是我漏掉了版本之间的某些更改。我在下面提供了示例代码以及两种方法的Visual Studio html可视化输出。请问是否有任何可能对此问题提供帮助的意见?

更新:经过来自@GSerg有益的建议进行不同测试后,我发现当您在插入字符串或字符串生成器中使用html标记时,此bug仅在.Net 6中发生,并将文本截断到插入变量之前并将其插入到第二行。我附加了一个新截屏,显示了使用Visual Studio Visualizer的这种行为。

var subect = "Subect Example";
var test = $"<p><strong><span style=\"font-size: 20px;\">{subject}</span></strong></p><p><span style=\"color: rgb(34, 34, 34); font-family: Arial, Helvetica, sans-serif; " +
           $"font-size: small; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; " +
           $"text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; " +
           $"text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;\">The following information is in beta testing and isn't meant for a live portfolio. " +
           $"Use this information for paper trading only until further notice.</span></p>";

.Net 5 HTML 输出: 输入图像描述

.Net 6 HTML 输出: 输入图像描述

.Net 6 文本输出: 输入图像描述


6
我怀疑这与 StringBuilder 没有任何关系。似乎你用来显示字符串的控件已经改变了。很可能,它对输入进行转义以防止注入攻击。 - BlueRaja - Danny Pflughoeft
1
从文档中得知:*'查看HTML字符串数据 格式良好的HTML字符串看起来像在浏览器中呈现的一样,如下图所示。格式不正确的HTML可能会显示为纯文本。'* 你的 test 变量不包含有效的html(缺少<html>标签),因此它的行为符合预期。 - Steeeve
1
@GSerg 是的,正确的。首先,即使我删除了字符串生成器,它仍然会发生。我正在正确使用字符串生成器,但是我没有粘贴完整的代码,因为我只想为这里的每个人粘贴一个最小可重现的示例。当我删除字符串生成器并仅保留连接时,它仍然会发生。当我重新启动计算机时,它仍然会发生。但是,如果我删除字符串插值,它就可以正常工作。我最好的猜测是,由于在字符串中使用HTML代码时只有在使用最新的.Net时才会出现问题,所以字符串插值存在错误。运行我的代码并自己看看。 - DarthVegan
1
@AlexeiLevenkov 这是最小可重现示例的定义。你只需要Visual Studio,并将此代码粘贴到基本控制台应用程序项目中即可。 - DarthVegan
1
就像我所说的那样,我只是将字符串插值代码片段插入了sharplab.io (这个网站通常有最新分支),以查看运行时/JIT本身是否可能出现错误编译。如果你能在Visual Studio之外重现它(也就是说,Console.WriteLine显示一个错误的值),那么很可能存在需要调查的问题(然后你应该发布一个完整可运行的程序);如果它仅在Visual Studio中失败,则是一个很好的bug供VS开发人员挖掘,但其他人几乎没有任何意义去这么做。 - Jeroen Mostert
显示剩余17条评论
1个回答

2
这似乎是 Visual Studio 2022 的一个错误,因为它还在预览阶段,所以这并不出乎意料。 在这个错误被修复之前,您可以使用 dotnet cli 作为解决方法进行构建。
以下代码重现了这个错误。
string two= "2";
string test = $"1 {two} 3" 
    + $" 4" 
    + $" 5";
Console.WriteLine(test);

当使用Visual Studio 2022 preview 3.1将此代码构建为.NET 6.0时,代码将被编译为

    string two = "2";
    DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(8, 1);
    defaultInterpolatedStringHandler.AppendLiteral(" 3");
    defaultInterpolatedStringHandler.AppendFormatted(two);
    defaultInterpolatedStringHandler.AppendLiteral("1 ");
    defaultInterpolatedStringHandler.AppendLiteral(" 4");
    defaultInterpolatedStringHandler.AppendLiteral(" 5");
    string test = defaultInterpolatedStringHandler.ToStringAndClear();
    Console.WriteLine(test);

这将产生输出 321 4 5

但这仅适用于使用Visual Studio构建.NET 6.0。 使用dotnet build进行构建时, 代码被编译为

    string two = "2";
    string test = "1 " + two + " 3 4 5";
    Console.WriteLine(test);

哪个会产生正确的输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接