6 Stimmen

Shared-Methode in VB.NET kann nicht mit diesem warum?

(Ich habe es mit diese Frage aber dieser Code isoliert das Problem besser).

Ich habe diesen Code:

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

Ich erhalte den folgenden Fehler beim Hervorheben von DoStuff(aStuff):

Kann sich nicht auf ein Instanzmitglied von einer Klasse aus einer gemeinsamen Methode oder Shared-Member-Initialisierer ohne eine explizite Instanz der Klasse.

Habe ich nicht einen expliziten Fall von Stuff bekommen, als ich die Dim-Anweisung schrieb?

Ich verstehe nicht, was los ist. Vielen Dank im Voraus!

13voto

Anax Punkte 8732

I denken das Problem liegt bei der Subroutine DoStuff. Wenn Ihre beiden Unterprogramme in derselben Klasse liegen, versuchen Sie, DoStuff aus PopulateTextFields heraus aufzurufen, das ein gemeinsames Unterprogramm ist.

Um dies zu erreichen, müssen Sie DoStuff ebenfalls als Shared deklarieren.

4voto

Quintin Robinson Punkte 78652

Ja, das haben Sie, aber Sie beziehen sich nicht auf aStuff Sie versuchen, sie in der statischen Implementierung der Klasse aufzurufen, außerdem setzen Sie die aStuff zu einer separaten Instanz durch jede Schleifeniteration. ändern Sie Ihren Code zu:

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

Und es sollte funktionieren, aber vielleicht nicht wie erwartet, ich weiß nicht wirklich Ihre Absicht, ein privates Mitglied zu haben, das die Änderung einer separaten Referenz seines eigenen Typs behandelt.

Es kann sinnvoll sein, die Signatur von DoStuff zu:

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

und rufen es dann als auf:

aStuff.DoStuff() 'Will modify this instance

3voto

Joel Coehoorn Punkte 377088

Du hast nicht geteilt die Typ, zu dem diese Methoden gehören. Aufgrund Ihrer Verwirrung vermute ich, dass sie Teil der Klasse "Stuff" sind. Aber das ist nicht wirklich wichtig. Es klingt so, als ob Sie eines von zwei Dingen vergessen haben:

  • Durch das Erstellen einer Instanz des Typs in der gemeinsamen Methode wird die gemeinsame Methode nicht irgendwie mit dieser Instanz verknüpft. Sie könnten schließlich 10 oder 1000 Instanzen in der Methode erstellen.

  • Durch die Übergabe einer Instanz als Parameter wird die Funktion nicht mit einer Instanz verknüpft. Ein Parameter ist keine Aufrufstelle.

In jedem Fall geht es um die Bereitstellung eines instanzierten Anrufsortes. Ihr DoStuff Funktion ist nicht gemeinsam genutzt werden, so dass der Compiler denkt, dass er Zugriff auf den Zustand benötigt, der von einer bestimmten Instanz Ihres Typs bereitgestellt wird. Diese Instanz ist die Aufrufstelle der Methode. Sie brauchen entweder eine Instanz des Typs, um sie aufzurufen von : SomeInstance.DoStuff(aStuff) , oder Wenn die Methode nicht wirklich Zugriff auf einen Typzustand benötigt, müssen Sie sie als gemeinsam genutzt kennzeichnen und so aufrufen: Stuff.DoStuff(aStuff)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X