ほんの少し前に、以下が合法であることを発見してショックを受けました (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())
上記の出力は、私が思っていたような「0」ではなく、「10」を出力します (もちろん、この期待自体にある種の恐怖が吹き込まれていました)。したがって、を渡すことができるMe
ByRef
ように見えますが、動作はコンパイラによって何らかの形でオーバーライド (?) され、を渡したかMe
ByVal
のようになります。
- なぜ渡すことが合法なの
Me
ByRef
ですか?(下位互換性の説明はありますか?) - これを行う動作はコンパイラによってオーバーライドされるというのは正しいですか? そうでない場合、何が欠けていますか?