【问题标题】:VB.NET inheritance IntelliSense phantom memberVB.NET 继承 IntelliSense 幻象成员
【发布时间】:2020-12-15 15:14:12
【问题描述】:

我有一组通用类,设置为表示数据库记录集/数据表(集合类)中的数据,其中一个子对象表示一行(行类)。然后继承这些以表示特定表。出于某种原因,当我使用这些继承的对象时,我突然在 IntelliSense 中看到了一个新成员:$VB$ClosureStub_get_RowCount_MyBase 在已实现的集合类(记录集/数据表)的实例上。它还包含正确列出的Public ReadOnly Property RowCount,它实际上并不存在于已实现的中间类中,因为继承了基类代码而存在。

这显示了一个示例继承类的完整成员列表,其中仅包含Public Shadows Function GetRowClassPublic Shadows Iterator Function RowClasses() 和一个真实函数Public Function GetTermString。所有其他成员都派生自继承的基类或 .NET 框架本身(Equals、GetHashCode、GetType、ToString)。 $VB$ClosureStub_get_RowCount_MyBase 也不存在。

这只是最近才开始出现,除了最近在基类中进行的其他修复的重新编译,当然需要重新编译实现类,关于继承类或实现类并没有真正改变。这是什么意思?为什么会开始出现这种情况?任何理解这一点的帮助将不胜感激!

【问题讨论】:

  • 有截图或多张截图吗?
  • 请阅读this,然后适当地更新您的问题。

标签: .net vb.net inheritance


【解决方案1】:

如果我采用这种方法:

Sub Main
    
    Dim i As Integer = 42

    Dim f As Func(Of Integer) = Function()
                                    Return i * 2
                                End Function
        
    Console.WriteLine(f())
    
End Sub

看看生成的 IL,我明白了:

.method public 
    instance void Main () cil managed 
{
    // Method begins at RVA 0x20ca
    // Code size 35 (0x23)
    .maxstack 8

    IL_0000: newobj instance void '_Closure$__2-0'::.ctor()
    IL_0005: dup
    IL_0006: ldc.i4.s 42
    IL_0008: stfld int32 '_Closure$__2-0'::$VB$Local_i
    IL_000d: ldftn instance int32 '_Closure$__2-0'::_Lambda$__0()
    IL_0013: newobj instance void class [mscorlib]System.Func`1<int32>::.ctor(object, native int)
    IL_0018: callvirt instance !0 class [mscorlib]System.Func`1<int32>::Invoke()
    IL_001d: call void [mscorlib]System.Console::WriteLine(int32)
    IL_0022: ret
}

请注意,有一个名为$VB$Local_i 的局部变量。这就是 VB 实现闭包的方式。

你展示的是一个类似的闭包。

尚不清楚为什么它会出现在智能感知中。

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 2010-09-20
    • 1970-01-01
    • 2013-06-17
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多