Улучшена обработка пустых строк поиска с помощью 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. Это также помогает унифицировать поведение платформы Windows и платформ, отличных от Windows. Дополнительные сведения см. в статьях dotnet/runtime#13383 и dotnet/runtime##13382.

Представленные версии

5,0

Никаких дополнительных действий от вас не требуется. Среда выполнения .NET 5 автоматически предоставляет новые варианты поведения.

Отсутствует параметр совместимости для восстановления старого поведения.

Затронутые API