Неожиданное поведение с EndsWith

Может ли кто-нибудь объяснить это поведение?

" ".EndsWith(((char)9917).ToString()) // returns true

StartsWith работает так же.

Ответы

Ответ 1

Как указано в комментариях, метод endswith использует текущую Культуру, если не указан тип StringComparison.

Вы можете заставить его работать, используя порядковое сравнение:

" ".EndsWith(((char)9917).ToString(), StringComparison.Ordinal); //false

(Ординал в конечном счете сравнит bytes символов для определения равенства)

Ответ 2

.NET Framework 4 в Windows 7 включает поддержку Unicode 5.1:

Соблюдающие культуру правила сортировки и обсалки, используемые при сравнении строк, зависят от версии .NET Framework. В .NET Framework 4 информация о сортировке, обсадке, нормализации и Unicode синхронизируется с Windows 7 и соответствует стандарту Unicode 5.1.

Символ, который вы используете, является символом Unicode 5.2, поэтому он не может корректно вести себя в любой функции, отличной от тех, которые сравнивают символы только по числу.

Вы должны увидеть другое поведение (но я не могу проверить его прямо сейчас) в Windows 8 и .NET 4.5: согласно документации, в этом случае поддерживается Unicode 6.0. Levesque в комментариях, в отличие от документации, не был изменен в более поздних версиях.