LastIndexOf 改进了空搜索字符串的处理

String.LastIndexOf 在较大字符串中搜索零长度(或零长度等效项)子字符串时,相关 API 现在返回正确的值。

更改描述

在 .NET Framework 和 .NET Core 1.0 - 3.1 中,当调用方搜索零长度子字符串时, String.LastIndexOf 相关 API 可能会返回不正确的值。

Console.WriteLine("Hello".LastIndexOf("")); // prints '4' (incorrect)

ReadOnlySpan<char> span = "Hello";
Console.WriteLine(span.LastIndexOf("")); // prints '0' (incorrect)

从 .NET 5 开始,这些 API 返回正确的值 LastIndexOf

Console.WriteLine("Hello".LastIndexOf("")); // prints '5' (correct)

ReadOnlySpan<char> span = "Hello";
Console.WriteLine(span.LastIndexOf("")); // prints '5' (correct)

在这些示例中,5 是正确答案,因为 "Hello".Substring(5)"Hello".AsSpan().Slice(5) 都生成了一个空字符串,而这个字符串显然与所寻找的空子字符串相等。

更改原因

此更改是修复 .NET 5 字符串处理的总体 bug 的一部分。 它还有助于统一 Windows 和非 Windows 平台之间的行为。 有关详细信息,请参阅 dotnet/runtime#13383dotnet/runtime##13382

已引入的版本

5.0

你不必执行任何操作。 .NET 5 运行时自动提供新行为。

没有兼容性开关来还原旧行为。

受影响的 API