Я бы добавил к ответу Дбемерлина, что ключом здесь является примечание Рико о том, что свойства не являются "lvalues" или, как мы их называем в C #, "переменными".
Чтобы изменить мутируемую структуру (а в идеале не следует; изменяемые структуры часто вызывают больше проблем, чем решают), вам необходимо мутировать переменную . Вот что переменная - это - место хранения, содержимое которого изменяется. Если у вас есть поле типа вектор, и вы говорите
Foo.vector.x = 123;
тогда у нас есть переменная типа value - поле Foo.vector - и поэтому мы можем изменить его свойство x. Но если у вас есть свойство типа значения:
Foo.Vector.x = 123;
свойство не является переменной. Это эквивалентно
Vector v = Foo.Vector;
v.x = 123;
, который изменяет временную переменную v, а не место хранения, поддерживающее свойство.
Вся проблема исчезнет, если вы откажетесь от изменяемых типов значений. Чтобы изменить x, создайте новый вектор с новыми значениями и замените все это:
Foo.Vector = new Vector(x, Foo.Vector.y);