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

标签 .net asp.net vb.net extension-methods

考虑以下因素:

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/

相关文章:

.net - 以编程方式运行可执行文件 .NET

c# - 如何仅 Ping IPv4?

c# - 如何将 DataTable 列的全部内容转换为 C# 中的分隔字符串?

jquery - 无法从 C# 中的 jQuery 对话框获取值?

c# - 如何开始使用 Google API v3?

vb.net - 在 VB.Net 中使用最小起订量的经验

.net - 如何在 Visual Studio 2022 中创建物理文件夹

.net - 读取 .NET 项目中的文本文件

c# - 远程处理异常 : Object 'xxx.rem' has been disconnected or does not exist at the server

vb.net - 如果我按住鼠标左键或右键,mouseenter 不起作用