为简短的回答道歉,但不,C# 语言规范不允许这样做。
看到这个answer 到另一个问题,看看当你尝试时会发生什么。
它还说明了为什么您不应该将属性设置为公共字段以规避限制。
希望对你有帮助
编辑:你问为什么?
您将变量传递给out 或ref 参数实际上是在传递变量的地址(或内存中的位置)。
在函数内部,编译器知道变量的真正位置,并获取并将值写入该地址。
属性看起来像一个值,但它实际上是一对函数,每个函数都有不同的签名。因此,要传递一个属性,您实际上需要传递两个函数指针,一个用于获取,一个用于设置。
传递给函数的东西与传递变量的地址完全不同
即一个变量地址v的两个函数指针。
更新
为什么 C# 不为我们解决这个问题?
我不是Eric Lippert,但我会试一试为什么
您要调用的函数的签名应该是什么?
假设您想打电话给void MyFn(ref int i),应该保持这种状态,还是应该改为说我们也允许属性?如果它更改为 void MyFn(prop_ref int i) 之类的语法,那么这将毫无用处,您无法将属性传递给库函数或未使用特殊 prop_ref 修饰符编写的第 3 方代码。无论如何,我认为您的建议不应该有所不同。
现在假设MyFn 将i 传递给COM 函数或WinAPI 调用,传递i 的地址(即在.net 外部,通过引用)。如果是房产,如何获得i的地址?属性下可能没有实际的 int 来获取地址。你做 VB.Net 做的事吗?
当属性作为 ByRef 参数传递给方法时,Vb.Net 编译器会发现。此时它声明了一个变量,将属性复制到变量中,通过引用传递变量,然后在调用方法之后,将变量复制回属性中。即
MyFunc(myObject.IntProperty)
变成
Dim temp_i As Integer = myObject.IntProperty
MyFunc(temp_i)
myObject.IntProperty = temp_i
在MyFunc 返回之前不会发生任何属性副作用,这可能会导致各种问题并导致非常微妙的错误。
在我看来,这个问题的 Vb.Net 解决方案也被破坏了,所以我不会接受它作为答案。
你认为 C# 编译器应该如何处理这个问题?