Извинения за короткий ответ, но не, спецификация языка C# запрещает его.
Видят этот ответ к другому вопросу видеть то, что происходит, когда Вы пробуете. Это также говорит, почему Вы не должны делать свойство просто быть общедоступным полем для обхождения ограничения.
Hope это помогает
РЕДАКТИРОВАНИЕ: Вы спрашиваете Почему?
Вы передаете переменную out
или ref
параметр, Вы на самом деле передаете адрес (или местоположение в памяти) переменной. В функции компилятор знает, где переменная действительно, и получает и пишет значения в тот адрес.
свойство А похоже на значение, торцы, это - на самом деле пара функций, каждого с различной подписью. Таким образом для передачи свойства необходимо было бы на самом деле передать два указателя функции, один для получения, и один для набора.
Thats совершенно другая вещь передать функции, чем адрес переменной
т.е. один переменный v's адреса два указателя функции.
Обновление
, Почему не делает C# просто, заботится об этом для нас?
я не Eric Lippert , но я буду делать попытку того, почему
, Что должно подпись функции, которую Вы вызываете быть?
Позволяет, говорят, что Вы хотите звонить void MyFn(ref int i)
, который должен остаться тем путем, или он должен измениться, чтобы сказать, что мы также позволяем свойства? Если это изменяется на некоторый синтаксис как void MyFn(prop_ref int i)
затем, это довольно бесполезно, Вы не можете передать свойства библиотечным функциям или стороннему коду, который не был написан со специальным prop_ref модификатором. Так или иначе я думаю, что Вы предлагаете, чтобы это не должно было отличаться.
Теперь позволяет, говорят MyFn
передачи i
к функции COM или вызову WinAPI, передавая адрес i
(т.е. за пределами .NET, касательно). Если это - свойство, как Вы получаете адрес i
? Не может быть никакого фактического интервала под свойством для получения адреса. Вы делаете то, что делает VB.Net?
Vb. Сетевой компилятор определяет, когда свойство передается как аргумент ByRef методу. В той точке это объявляет переменную, копирует свойство в переменную, передает переменную byref и затем после того, как метод называют, копирует переменную назад в свойство. т.е.
MyFunc(myObject.IntProperty)
становится
Dim temp_i As Integer = myObject.IntProperty
MyFunc(temp_i)
myObject.IntProperty = temp_i
, Любых побочных эффектов свойства не происходит до MyFunc
возвраты, которые могут вызвать все виды проблем и привести к [1 116] очень тонкие ошибки.
По моему скромному мнению Vb. Сетевое решение этой проблемы также повреждается, таким образом, я не собираюсь признавать что как ответ.
, Как Вы думаете, компилятор C# должен обработать это?
I think that E9
is an opcode for a relative jump: its operand specifies a relative distance to be jumped, plus or minus from the start of the next instruction.
If you want the operand to specify an absolute address, you would need a different opcode.
Вы можете использовать:
push DESTINATION_VA
ret
или
mov eax,DESTINATION_VA
jmp eax
относительную кодировку E9 JMP используются следующим образом:
CURRENT_RVA: jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])
push + RET - лучшее решение, если у вас есть адрес VA, а изображение не перемещено