Ошибка компилятора CS0200 с текстом «невозможно присвоить значение свойству или индексатору string.this[int] — доступ только для чтения» появляется в тот момент, когда код пытается изменить отдельный символ строки напрямую, например через конструкцию вида str[0] = 'a';. Компилятор C# блокирует такую операцию ещё до запуска программы, потому что строки в .NET устроены принципиально иначе, чем массивы символов в C или C++.
Причина кроется не в синтаксисе и не в настройках проекта, а в фундаментальном свойстве типа System.String: строки в .NET являются неизменяемыми (immutable). Индексатор this[int] у строки существует, но у него есть только метод чтения get — метод записи set отсутствует. Поэтому компилятор и сообщает, что присваивание невозможно.
Ниже разберём, почему строки сделаны неизменяемыми, в каких ситуациях разработчики чаще всего сталкиваются с этой ошибкой и какие есть рабочие способы «изменить» строку, не нарушая правил языка.
Почему строки в C# нельзя изменять посимвольно
Тип string в .NET спроектирован как неизменяемый объект. После создания строки её содержимое в памяти не меняется: любая операция, которая «модифицирует» строку (конкатенация, Replace, ToUpper), на самом деле создаёт новый объект в памяти, а старый остаётся нетронутым, пока его не соберёт сборщик мусора.
У такого решения есть веские основания:
- 🔒 Потокобезопасность: одну и ту же строку можно читать из нескольких потоков без блокировок.
- 🗝️ Ключи коллекций: строки можно безопасно использовать как ключи в Dictionary — их хеш-код никогда не изменится.
- ♻️ Интернирование: одинаковые строковые литералы могут ссылаться на один объект в памяти, что экономит ресурсы.
- 🛡️ Защита данных: строку, переданную в метод, нельзя «подменить» изнутри этого метода.
Индексатор string.this[int] предоставляет только доступ на чтение: вы можете получить символ по индексу (char c = str[3];), но не можете записать туда новое значение. Именно это ограничение и формулирует компилятор в сообщении об ошибке.
💡Строки в .NET неизменяемы: индексатор string.this[int] поддерживает только чтение. Любое «изменение» строки — это создание новой строки.