VB.NET中的共享方法无法处理这个原因?

时间:2009-10-22 21:42:30

标签: vb.net visual-studio-2005

(我尝试使用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):

  

无法引用实例成员   共享方法中的类或   没有的共享成员初始化程序   该类的显式实例。

当我写Dim语句时,我没有得到Stuff的显式实例吗?

不明白什么是错的。提前谢谢!

3 个答案:

答案 0 :(得分:13)

认为问题在于子程序DoStuff。如果你的潜艇都在同一个类中,你试图从PopulateTextFields中引用DoStuff,这是一个共享子。

为了实现这一点,您还需要将DoStuff声明为Shared。

答案 1 :(得分:4)

是的,但是你没有引用aStuff你试图在类的静态实现上调用它,而且你通过每次循环迭代将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

答案 2 :(得分:3)

您没有共享这些方法所属的类型。从你的困惑中,我猜它是“Stuff”课程的一部分。但这并不重要。听起来你忘了以下两件事之一:

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

  • 将实例作为参数传递不会将该函数与实例相关联。参数不是呼叫站点。

无论哪种方式,它都归结为提供一个实例调用站点。您的DoStuff函数共享,因此编译器认为它需要访问由您的类型的特定实例提供的状态。该实例是方法的调用站点。如果方法实际上不需要访问您需要的任何类型状态,您需要该类型的实例从:SomeInstance.DoStuff(aStuff)调用它将其标记为共享并将其命名为:Stuff.DoStuff(aStuff)