Это безопасно, потому что строки в .NET внутренне UTF-16. Кодовая точка Unicode может быть представлена одной или двумя кодовыми единицами UTF-16, и .NET char
является одной такой кодовой единицей.
Когда кодовая точка представлена двумя единицами, первая единица называется старшей суррогатной, а вторая называется малой суррогатной. Что важно в контексте этого вопроса, так это то, что суррогатные единицы относятся к определенному диапазону, U + D800 - U + DFFF. Этот диапазон используется только для представления суррогатных пар, одна единица в этом диапазоне не имеет значения и является недействительной.
По этой причине невозможно иметь допустимую строку utf-16, которая соответствует "части" суррогатной пары в другой допустимой строке utf-16.
Обратите внимание, что строка .NET может также представлять недопустимую строку utf-16. Если какой-либо аргумент Replace
недопустим - тогда он действительно может разбить суррогатную пару. Но - мусор, мусор, поэтому я не считаю это проблемой в данном случае.