Я просто быстро прочитал эту статью (в частности, немного о том, почему он решил использовать structs/fields вместо классов/свойства) и увидел эту строку:
Результат свойства не является истинным значением l, поэтому мы не можем делать что-то вроде Vertex.Normal.dx = 0. Цепочка свойств дает очень неожиданные результаты.
О каких неожиданных результатах он говорит?
Я бы добавил к dbemerlin ответ, что ключ здесь - это Рико, что свойства не являются "lvalues", или, как мы их называем в С#, "переменные".
Чтобы мутировать изменяемую структуру (и, в идеале, вы не должны: изменяемые структуры часто вызывают больше проблем, чем они решают), вам нужно мутировать переменную. Это переменная - место хранения, содержимое которого изменяется. Если у вас есть поле типа vector, и вы говорите
Foo.vector.x = 123;
то мы имеем переменную типа значения - поле Foo.vector - и поэтому мы можем изменить его свойство x. Но если у вас есть свойство типа значения:
Foo.vector.x = 123;
свойство не является переменной. Это эквивалентно
Vector v = Foo.Vector;
v.x = 123;
который мутирует временную переменную v, а не то, что место хранения поддерживает свойство.
Вся проблема исчезает, если вы отказываетесь от изменяемых типов значений. Чтобы изменить x, создайте новый вектор с новыми значениями и замените все:
Foo.Vector = new Vector(x, Foo.Vector.y);
Единственным "неожиданным" результатом будет то, что назначение не будет продолжаться, потому что Vertex.Normal возвращает копию, а код присваивает 0 в dx копии.
Я не могу проверить это сейчас, но это то, чего я ожидал бы (из того, что я знаю о работе .NET с структурами)
Vector v = Foo.Vector; vx = 123;
не будет делать то, что я ожидаю (исключая проблемы параллелизма и реализации свойств daft)