Строка в .NET реализована как copy-on-write (точнее: на основе пула строк) и как ссылочный тип. То, что вы пытаетесь сделать, это получить основной символ [], который составляет строку и изменить ее. Однако, поскольку string
реализован как copy-on-write, если это было успешным, вы бы не просто изменили одну строку, а все из них.
Например, это то, что может произойти, если ваш код будет изменить строку: (чтобы проиллюстрировать неверное предположение):
string s = "foo"; // create instance with foo
string t = s; // copy reference, contents aren't changed
char[] ch = s.ToCharArray(); // attempt to access underlying contents
ch[0] = 'b'; // attempts to change the underlying contents
Console.WriteLine(t); // 'boo'?
При попытке его, т будет «Foo», потому что основной содержимое остается нетронутым. ToCharArray создает копию базового содержимого, тем самым защищая основное содержимое, чтобы другие ссылки на один и тот же строковый объект не затрагивались.
Это также код причины, как это плохая практика:
string s = "";
for (int i=0; i<10000; ++i)
{
// makes a new instance of the string, copies the contents
// and appends a single char... as you can see 10K times...
s = s + "a";
}
Поэтому строки реализуются как неизменен: для защиты ссылок на строки от получения другого контента.
См. Также here о поведении пула строк.
Строки неизменяемы в .NET. Массивов обычно нет. – leppie
«это работает», только в том случае, если отсутствует компилятор или ошибка времени выполнения. Значение 's' не изменяется. –
Справа, отмечено :) – Igoy