刚才我震惊地发现以下是合法的(C#等价物绝对不是):
Class Assigner
''// Ignore this for now.
Public Field As Integer
''// This part is not so weird... take another instance ByRef,
''// assign it to a different instance -- stupid but whatever. '
Sub Assign(ByRef x As Assigner, ByVal y As Assigner)
x = y
End Sub
''// But... what's this?!?
Sub AssignNew()
''// Passing "Me" ByRef???
Assign(Me, New Assigner)
End Sub
''// This is just for testing.
Function GetField() As Integer
Return Me.Field
End Function
End Class
但对我来说更奇怪的是,它似乎并没有达到我的预期:
Dim a As New Assigner With {.Field = 10}
a.AssignNew()
Console.WriteLine(a.GetField())
上面的输出是“10”,而不是我想象的“0”(当然,这种期望本身就充满了某种恐怖)。所以看起来你可以通过Me
ByRef
,但是编译器会以某种方式覆盖(?)行为,就好像你已经通过了Me
ByVal
。
- 为什么通过是合法的
Me
ByRef
?(是否有一些向后兼容的解释?) - 我是否正确地说这样做的行为被编译器覆盖了?如果没有,我错过了什么?