Извиняюсь за короткий ответ, но нет, спецификация языка C # запрещает его.
См. ответ на другой вопрос, чтобы увидеть, что происходит, когда вы пытаетесь.
В нем также говорится, почему вы не должны делать свойство просто открытым, чтобы обойти ограничение.
Надеюсь, это поможет
РЕДАКТИРОВАТЬ: Вы спросите, почему?
Вы передаете переменную параметру out
или ref
, которому вы фактически передаете адрес (или место в памяти) переменной.
Внутри функции компилятор знает, где на самом деле находится переменная, и получает и записывает значения по этому адресу.
Свойство выглядит как значение, но на самом деле это пара функций, каждая из которых имеет свою сигнатуру. Таким образом, чтобы передать свойство, вам на самом деле нужно передать два указателя на функцию, один для получения и один для набора.
Это совершенно другая вещь, которую нужно передать в функцию, чем адрес переменной
т.е. один переменный адрес v с двумя указателями на функции.
Update
Почему C # не присматривает за нами?
Я не Эрик Липперт , но я пойду, почему
Какой должна быть подпись функции, которую вы вызываете?
Допустим, вы хотите позвонить void MyFn(ref int i)
, должно ли это остаться таким же образом, или оно должно измениться, сказав, что мы также разрешаем свойства? Если он изменяется на некоторый синтаксис, такой как void MyFn(prop_ref int i)
, то это довольно бесполезно, вы не можете передавать свойства библиотечным функциям или стороннему коду, который не был написан с помощью специального модификатора prop_ref. Во всяком случае, я думаю, вы предлагаете, что это не должно быть иначе.
Теперь допустим, что MyFn
передает i
в функцию COM или вызов WinAPI, передавая адрес i
(т.е. вне .net, по ссылке). Если это свойство, как вы получаете адрес i
? Там может быть нет фактического int под свойством, чтобы получить адрес. Вы делаете то, что делает VB.Net?
Компилятор Vb.Net определяет, когда свойство передается методу в качестве аргумента ByRef. В этот момент он объявляет переменную, копирует свойство в переменную, передает переменную byref, а затем после вызова метода копирует переменную обратно в свойство. т.е.
MyFunc(myObject.IntProperty)
становится
Dim temp_i As Integer = myObject.IntProperty
MyFunc(temp_i)
myObject.IntProperty = temp_i
Любые побочные эффекты свойств не происходят до тех пор, пока не вернется MyFunc
, что может вызвать всевозможные проблемы и привести к очень незначительным ошибкам.
По моему скромному мнению, решение этой проблемы в Vb.Net также не работает, поэтому я не собираюсь принимать это как ответ.
Как вы думаете, компилятор C # должен справиться с этим?