Так как никто не может сделать
Foo bar = new Foo(1, 2);
bar.X = 5;
Почему можно использовать:
Foo bar = new Foo(1, 2);
bar.Change(5);
Ваш первоначальный вопрос на самом деле не может быть дан ответ, потому что он основан на полностью ложном предположении . Оба примера кода абсолютно законны, и поэтому вопрос о том, почему один из них является незаконным, не имеет смысла. Давайте перейдем к следующему вопросу:
Если структуры изменчивы, то почему они не могут быть изменены в списке или возвращены из свойства?
Поскольку переменные изменчивы, а значения неизменны.
Вот почему их называют «переменными», в конце концов, , потому что они могут измениться .
Когда вы говорите "bar.X = 5", "bar" - это локальная переменная . Переменные могут изменяться.
Когда вы говорите «bar.Change (5)», «bar» является локальной переменной . Переменные могут изменяться.
Когда вы говорите «myArray [123] .X = 5», «myArray [123]» представляет собой элемент массива , а элемент массива представляет собой переменную . Переменные могут изменяться.
Когда вы говорите «myDictionary [123] .X = 5», «myDictionary [123]» равен , а не является переменной . Значение возвращается из словаря, а не ссылка на место хранения . Поскольку это значение, а не переменная, там нет ничего, что могло бы измениться, поэтому компилятор не позволяет его изменять.
Тонкий момент заключается в том, что при попытке изменить поле получатель должен быть переменной. Если это не переменная, это не имеет смысла; Вы явно пытаетесь изменить переменную, и там нечего менять. Когда вы вызываете метод, получатель должен иметь значение variable , но что если у вас есть значение? Метод может не пытаться что-либо изменить, поэтому его следует разрешить. Что на самом деле делает компилятор, если получатель вызова метода для структуры не является переменной, то он создает новую временную локальную переменную и вызывает метод с этой переменной. Так что если вы говорите: "myDictionary [123] .Change (5);" это то же самое, что сказать
var temp = myDictionary[123];
temp.Change(5);
Здесь «temp» - это переменная, и метод мутации может изменять временную копию.
Теперь понятно? Ключ к выводу здесь: переменные могут меняться .