2009-10-22 18 views
6

(I tratado con this question pero este código aísla mejor el problema.)El método compartido en VB.NET no puede manejar esto ¿por qué?

tengo este código:

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 

me sale el siguiente error destacando DoStuff (aStuff):

No se puede consulte un miembro de instancia de una clase desde un método compartido o inicializador de miembro compartido sin una instancia explícita de la clase.

¿No obtuve una instancia explícita de Cosas cuando escribí la declaración Dim?

No entiendo lo que está mal. ¡Gracias por adelantado!

Respuesta

12

I que el problema radica en la subrutina DoStuff. Si sus dos subs se encuentran en la misma clase, está tratando de hacer referencia a DoStuff dentro de PopulateTextFields, que es un sub compartido.

Para lograr esto, necesita declarar DoStuff como Compartido también.

+0

Ese fue el problema. ¡Gracias! – John

+0

No puedo creer 1) qué fácil fue esto y 2) que no me di cuenta de esto sin una búsqueda en Google. Gracias por esto. – CryptoJones

4

Sí lo hizo, pero no se está haciendo referencia aStuff que está intentando llamar a la aplicación estática de la clase, además, está restableciendo aStuff a una instancia independiente a través de cada iteración del bucle .. cambiar el código para:

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 

Y debería funcionar, pero tal vez no como se esperaba, realmente no sé su intención de tener un miembro privado que maneje el cambio de una referencia separada de su propio tipo.

Puede ser apropiado para cambiar la firma de DoStuff a:

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

y luego llamar como:

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

Gracias para responder a Quintin. Lo siento, no tenía claro cuáles eran los métodos en los que: DoStuff en mi aplicación estaba en el mismo ámbito que PopulateTextFields, y no un método miembro de Stuff. En cualquier caso, me enseñaste algo. – John

3

Usted no compartió a que pertenecen estos métodos. Por su confusión, supongo que es parte de la clase "Cosas". Pero en realidad no importa. Parece que estás olvidando una de dos cosas:

  • Creación de una instancia del tipo en el método compartido no de alguna manera no adjuntar el método compartido a esa instancia. Después de todo, puedes crear 10 o 1000 instancias en el método.

  • Pasar una instancia como parámetro no asocia la función con una instancia. Un parámetro no es un sitio de llamada.

De cualquier forma, todo se reduce a proporcionar un sitio de llamada instanciado. Su función DoStuff es no compartida, por lo que el compilador cree que necesita acceso al estado proporcionado por una instancia específica de su tipo. Esa instancia es el sitio de llamada del método.O se necesita una instancia del tipo llamarlo de: SomeInstance.DoStuff(aStuff), o si el método no necesita realmente el acceso a cualquier tipo de estado que necesita para marcarlo compartida y lo llaman así: Stuff.DoStuff(aStuff)

+0

¡Gracias por responder a Joel! Aprendí algunas cosas de tu respuesta. – John

Cuestiones relacionadas