Це випадок негерметичної абстракції. Властивість насправді є методом, атрибути get та set для індексатора збираються до методів get_Index () та set_Index. Компілятор робить приголомшливу роботу, приховуючи цей факт, він автоматично переводить присвоєння властивості у відповідний метод set_Xxx (), наприклад.
Але це зростає, коли ви передаєте параметр методу за посиланням. Для цього потрібно, щоб компілятор JIT передав покажчик на розташування пам'яті переданого аргументу. Проблема в тому, що її немає, для присвоєння значення властивості потрібно викликати метод встановлення. Викликаний метод не може визначити різницю між переданою змінною та переданою властивістю, і, отже, не може знати, чи потрібен виклик методу.
Примітно, що це насправді працює у VB.NET. Наприклад:
Class Example
Public Property Prop As Integer
Public Sub Test(ByRef arg As Integer)
arg = 42
End Sub
Public Sub Run()
Test(Prop) '' No problem
End Sub
End Class
Компілятор VB.NET вирішує це шляхом автоматичної генерації цього коду для методу Run, вираженого в C #:
int temp = Prop;
Test(ref temp);
Prop = temp;
Який спосіб вирішення проблеми ви також можете використовувати. Не зовсім впевнений, чому команда C # не застосувала той самий підхід. Можливо тому, що вони не хотіли приховувати потенційно дорогі дзвінки геттера та сеттера. Або зовсім недіагностична поведінка, яку ви отримаєте, коли у установника є побічні ефекти, які змінюють значення властивості, вони зникнуть після призначення. Класична різниця між C # та VB.NET, C # - "без сюрпризів", VB.NET - "змуси це працювати, якщо можеш".