Ошибка в IndexOf с InvariantCultureIgnoreCase в .NET 5 и выше?C#

Место общения программистов C#
Anonymous
Ошибка в IndexOf с InvariantCultureIgnoreCase в .NET 5 и выше?

Сообщение Anonymous »

Я обнаружил странную проблему с методом IndexOf в .NET 5 и более поздних версиях.
У меня есть две строки, которые равны с помощью InvariantCultureIgnoreCase:

Код: Выделить всё

string.Equals("est", "est", System.StringComparison.InvariantCultureIgnoreCase) // returns True
Поскольку st по спецификациям Unicode эквивалентен «ST».
Использование IndexOf, как в этом примере
Поскольку st по спецификациям Unicode эквивалентно "ST".
Использование IndexOf, как в этом примере

Код: Выделить всё

"est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns 0
возвращает 0, что и ожидалось, поскольку мы видели, что обе строки эквивалентны в InvariantCultureIgnoreCase
Хотя, когда мы добавляем пробел ( " ") в исходную строку

Код: Выделить всё

" est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns -1
функция возвращает -1! Что неожиданно. Мы обнаружили, что получаем -1 для .NET 5 и выше (включая .NET 8).
Однако в .NET Framework 4.7.2
< pre class="lang-cs Prettyprint-override">

Код: Выделить всё

" est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns 1
функция возвращает 1, как и ожидалось.
Ожидаемый результат в .NET:

Код: Выделить всё

"est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns 0
" est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns 1
или

Код: Выделить всё

"est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns -1
" est".IndexOf("est",  System.StringComparison.InvariantCultureIgnoreCase) // returns -1
Получение 0 и -1 соответственно является неожиданным.
Это ошибка в реализации .NET IndexOf? Есть ли обходной путь, который решает эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -and-above

Вернуться в «C#»