从 .NET Framework 4.8 升级到 .NET 6 后奇怪的 String.StartsWith 和 .Contains 行为

Tim*_*m A 2 c# .net-core .net-4.8 .net-6.0

我们目前正在将应用程序从 .Net Framework 4.8 更新到 .NET 6,有一件特别的事情让我感到困惑:

"MyString".StartsWith("\x01");
Run Code Online (Sandbox Code Playgroud)

在 .Net Framework 中,这将返回 false。正如我所期望的,因为字符串的第一个字符不是'\x01'

但在 .Net 6 中(也已经有 .Net 5),这个评估结果为 true?我们找不到任何关于为什么这种行为发生变化的解释,您知道我们可以参考什么资源吗?

我们发现,这可以通过使用新的重载来解决StartsWith(char),而不是使用字符串参数的(旧的?)重载。

升级路径不会自动替换这些路径,因此我预计行为也会相同。

vcs*_*nes 6

这是因为 .NET 从使用 NLS 更改为 ICU,并且默认情况下对 .NET 执行区域性感知比较StartsWith(string).NET 运行时存储库中的更改有一些背景知识。

考虑使用序数比较:

"MyString".StartsWith("\x01", StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

这将达到您的预期。