Общий метод в VB.NET не может справиться с этим, почему? - PullRequest
6 голосов
/ 23 октября 2009

(я пытался с этот вопрос , но этот код лучше изолирует проблему.)

У меня есть этот код:

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):

Невозможно обратиться к экземпляру члена класс из общего метода или инициализатор общего члена без явный экземпляр класса.

Разве я не получил явный экземпляр Stuff, когда писал оператор Dim?

Не понимаю, в чем дело. Заранее спасибо!

Ответы [ 3 ]

13 голосов
/ 23 октября 2009

Я думаю проблема заключается в подпрограмме DoStuff. Если обе ваши подпрограммы принадлежат одному и тому же классу, вы пытаетесь сослаться на DoStuff из PopulateTextFields, которая является общей подпрограммой.

Для этого вам нужно также объявить DoStuff как Shared.

4 голосов
/ 23 октября 2009

Да, вы сделали, но вы не ссылаетесь на 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
3 голосов
/ 23 октября 2009

Вы не поделились типом , к которому относятся эти методы. Судя по твоему замешательству, я предполагаю, что это часть класса "Материал". Но это не имеет значения. Похоже, вы забыли одну из двух вещей:

  • Создание экземпляра типа в разделяемом методе каким-то образом не привязывает разделяемый метод к этому экземпляру. В конце концов, вы можете создать 10 или 1000 экземпляров в методе.

  • Передача экземпляра в качестве параметра не связывает функцию с экземпляром. Параметр не является сайтом вызова.

В любом случае, все сводится к предоставлению инстансированного сайта вызовов. Ваша DoStuff функция не совместно используется, и поэтому компилятор считает, что ему нужен доступ к состоянию, предоставленному конкретным экземпляром вашего типа. Этот экземпляр является сайтом вызова метода. Вам либо нужен экземпляр типа, чтобы вызвать его из : SomeInstance.DoStuff(aStuff), или , если метод на самом деле не нуждается в доступе к какому-либо состоянию типа, вам нужно пометить его как общий и Назовите это так: Stuff.DoStuff(aStuff)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...