Тот факт, что String
не реализует IList<char>
, меня не удивляет. На самом деле, что меня несколько удивляет, так это то, что он реализует IEnumerable<char>
.
Почему? Потому что строка на самом деле не является последовательностью символов.
Видите ли, в Unicode есть 1114,112 кодовых точек, но char
- это всего 16 бит. Строка содержит последовательность символов (т. Е. Кодовые точки Юникода), которые кодируются с использованием UTF16 в количестве значений char
. В результате число символов Юникода в строке может быть меньше количества char
значений в строке.
Теперь я понимаю, что это звучит очень странно для большинства людей, особенно для тех, кто говорит по-английски, потому что они всегда были довольны ASCII и предполагали, что один char
равен одному символу. Во многих случаях это предположение даже верно. Это может быть причиной того, что string
реализует IEnumerable<char>
, как своего рода компромисс с устаревшим миром, не поддерживающим юникод.
Но правда в том, что мы не можем ответить на ваш вопрос. Единственные, кто может сказать вам, почему они спроектировали струны так, как они это сделали, - это люди из команды BCL в то время.