代码之家  ›  专栏  ›  技术社区  ›  John

VB.NET中的共享方法无法处理此问题,为什么?

  •  6
  • John  · 技术社区  · 16 年前

    (我试过了 this question 但此代码可以更好地隔离问题。)

    我有以下代码:

    Public Shared Sub PopulateTextFields(ByRef stuffList As List(Of Stuff))
        Dim aStuff As New Stuff
        For Each aStuff In stuffList
            DoStuff(aStuff)
        Next
    End Sub
    
    Private Sub DoStuff(ByRef theStuff as Stuff)
        ....
    End Sub
    

    突出显示DoStuff(aStuff)时出现以下错误:

    无法引用的实例成员 共享方法中的类或

    当我写这份声明的时候,我没有得到一个明确的例子吗?

    我不明白怎么了。提前谢谢!

    3 回复  |  直到 9 年前
        1
  •  13
  •   Anax    16 年前

    认为 问题在于子程序DoStuff。如果两个sub位于同一个类中,那么您正试图从PopulateTextFields中引用DoStuff,这是一个共享sub。

        2
  •  4
  •   Quintin Robinson    16 年前

    是的,你做了,但你没有引用 aStuff 您试图在类的静态实现上调用它,而且您正在重置 阿斯图夫

    Public Shared Sub PopulateTextFields(ByRef stuffList As List(Of Stuff))
        Dim aStuff As New Stuff
        For Each aStuff In stuffList
            aStuff.DoStuff(aStuff)
        Next
    End Sub
    
    Private Sub DoStuff(ByRef theStuff as Stuff)
        ....
    End Sub
    

    它应该可以工作,但可能不像预期的那样,我真的不知道您是否打算让一个私有成员来处理更改它自己类型的单独引用。

    可能适合更改的签名 DoStuff 致:

    Private Sub DoStuff()
        ....
        'Use the Me reference here to change myself
        ....
    End Sub
    

    然后称之为:

    aStuff.DoStuff() 'Will modify this instance
    
        3
  •  3
  •   Joel Coehoorn    16 年前

    你没有分享 哪一个 这些方法所属的类型。从你的困惑中,我猜这是“东西”类的一部分。但这并不重要。听起来你好像忘记了两件事中的一件:

    • 在共享方法中创建该类型的实例不会以某种方式将共享方法附加到该实例。毕竟,您可以在该方法中创建10或1000个实例。

    • 将实例作为参数传递不会将函数与实例关联。参数不是调用站点。

    无论哪种方式,它都归结为提供一个实例调用站点。你的 DoStuff 功能是 从…起 : SomeInstance.DoStuff(aStuff) , Stuff.DoStuff(aStuff)