Давайте посмотрим, что происходит в этом утверждении:
structAsProperty.InjectValue("structAsProperty");
Нам не нужно далеко ходить.Самое первое, что должно произойти, - это разрешить часть structAsProperty
оператора.Ключевым моментом здесь является понимание того, что компилятор перезаписывает разделы get
и set
свойства как вызовы метода за кулисами.
Итак, что мы действительно имеем здесь, это вызов метода, который возвращает наше значение структуры.Я говорю «значение» здесь, а не «объект», потому что структуры являются типами значений .Для типов значений передача или возврат из метода приводит к копированию значения.
Теперь мы знаем достаточно, чтобы понять, что произошло.Мы вызываем InjectValue()
для копии структуры свойства, а не для экземпляра в самом свойстве.Затем мы модифицируем эту копию с помощью метода InjectValue()
и затем быстро забываем, что копия когда-либо существовала.
Вы можете исправить это так:
var prop = structAsProperty; //now we have a variable to keep the result of the implicit get accessor method
prop.InjectValue("structAsProperty");
structAsProperty = prop;