考虑以下因素:
Public Module Extensions
<Extension()> _
Public Sub Initialize(ByRef Target as SomeClass, ByVal SomeParam as Something )
...
Target = SomethingElse
end Sub
End Module
Class SomeClass
...
sub New(ByVal SomeParam as Something )
Me.Initialize(SomeParam)
end sub
sub New()
end sub
End Class
'Case 1: Doesnt Work...why????:
Dim foo as new SomeClass(SomeParam) 'foo remains uninitialized
'Case 2: Does Work:
Dim foo as new SomeClass()
foo.Initialize(SomeParam) 'foo is initialized
问题: 为什么情况 1 无法按预期初始化对象?
最佳答案
这里的问题是 VB.Net 支持多种使用 ByRef 参数的方式。我在最近的一篇博客文章中对这些类型做了详细的解释
这里发生的事情是 Me
不是一个可分配的值。因此,VB 编译器不会将 Me
作为 byRef 参数传递,而是传递一个临时参数。这通常被称为“Copy Back ByRef”。它有效地生成以下代码
Dim temp = Me
Initialize(temp, SomeParam)
对于 Me
而言,无法解决此问题,因为它不可分配。在局部变量 foo 的情况下,这会按预期工作,因为 foo 是一个有效的 ByRef 值。
关于.net - 在对象的构造函数中使用扩展方法,其中 "Me"是 ByRef 目标对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225110/