gpt4 book ai didi

.net - 在对象的构造函数中使用扩展方法,其中 "Me"是 ByRef 目标对象

转载 作者:行者123 更新时间:2023-12-03 07:27:09 25 4
gpt4 key购买 nike

考虑以下因素:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com