2009-10-22 19 views
6

(ho provato con this question ma questo codice isola meglio il problema.)Il metodo condiviso in VB.NET non può gestire questo perché?

ho questo codice:

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 

ottengo il seguente errore evidenziando DoStuff (aStuff):

Impossibile fare riferimento a un membro di istanza di una classe da un metodo condiviso o inizializzatore di membro condiviso senza un'istanza esplicita della classe .

Non ho ricevuto un'istanza esplicita di roba quando ho scritto l'istruzione Dim?

Non capisco cosa c'è che non va. Grazie in anticipo!

risposta

12

ho che il problema si trova con la subroutine DoStuff. Se entrambi i tuoi sottotitoli si trovano nella stessa classe, stai cercando di riferirti a DoStuff da PopulateTextFields, che è un sotto condiviso.

Per ottenere ciò, è necessario dichiarare anche DoStuff come condiviso.

+0

Questo era il problema. Grazie! – John

+0

Non posso credere 1) quanto fosse facile e 2) che non me ne fossi reso conto senza una ricerca su google. Grazie per questo. – CryptoJones

4

Sì avete fatto, ma non si fa riferimento aStuff si sta tentando di chiamare sull'attuazione statico della classe, inoltre, si sta reimpostando aStuff ad un'istanza separata attraverso ogni iterazione del ciclo .. modificare il codice per:

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 

E dovrebbe funzionare, ma forse non come previsto, in realtà non conosco il tuo intento di avere un membro privato che gestisce la modifica di un riferimento separato del proprio tipo.

Può essere opportuno modificare la firma di DoStuff a:

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

e quindi chiamare come:

aStuff.DoStuff() 'Will modify this instance 
+1

Grazie per aver risposto a Quintin. Mi spiace di non essere chiaro su quali fossero i metodi: DoStuff nella mia app era nello stesso ambito di PopulateTextFields, e non in un metodo membro di Stuff. In ogni caso, mi hai insegnato qualcosa. – John

3

Non hai condiviso quale tipo appartiene a questi metodi. Dalla tua confusione, suppongo che faccia parte della classe "Stuff". Ma non importa. Sembra che si stia dimenticando una delle due cose:

  • Creazione di un'istanza del tipo nel metodo condiviso non in qualche modo collegare il metodo condiviso a tale istanza. Dopo tutto, potresti creare 10 o 1000 istanze nel metodo.

  • Il passaggio di un'istanza come parametro non associa la funzione a un'istanza. Un parametro non è un sito di chiamata.

In entrambi i casi, si tratta di fornire un sito di chiamata istanziato. La tua funzione DoStuff è non condivisa, e quindi il compilatore pensa di aver bisogno di accedere allo stato fornito da un'istanza specifica del tuo tipo. Quell'istanza è il sito di chiamata del metodo.Si sia bisogno di un esempio del tipo di chiamarlo da: SomeInstance.DoStuff(aStuff), o se il metodo non ha veramente bisogno l'accesso a qualsiasi stato tipo è necessario marcare ha condiviso e chiamare in questo modo: Stuff.DoStuff(aStuff)

+0

Grazie per aver risposto a Joel! Ho imparato alcune cose dalla tua risposta. – John

Problemi correlati