Поведение, которое вы видите, является следствием того факта, что .net не делает различий между свойствами структуры и методами, которые изменяют поля самой структуры, и теми, которые этого не делают. В идеале языки .net запрещали бы использование любых изменяющих методов и свойств в структурах только для чтения, в то же время разрешая использование неизменяемых структур. К сожалению, поскольку .net не дает указаний на то, будет ли метод или свойство структуры изменять базовую структуру, современные C # и vb.net просто предполагают, что установщики свойств будут влиять на базовую структуру, а другие методы этого не сделают. Старые компиляторы C # допускают вызов всего кода члена структуры, включая средства получения свойств, часто с нежелательными результатами.
Очень жаль, что Microsoft решила, что структуры должны быть изменены с помощью установщиков свойств, а не указывать, что структуры, которые должны были быть изменяемыми, должны либо открывать поля напрямую, либо изменяться статическими методами. Если бы они применили такой подход к таким вещам, как Point
, жалобы, которые приводили к тому, что изменяемые структуры назывались «злыми», были бы предотвращены, и такой код, как ваш, работал бы просто отлично. Ну что ж, так много за чудеса бесполезной «инкапсуляции».