2009-10-22 4 views
6

(私はthis questionと試みたが、このコードは、より良い問題を分離します。)VB.NETの共有メソッドがこれを処理できないのはなぜですか?

私はこのコードを持っている:

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のインスタンスを取得できませんでしたか?

何が問題なのか理解していない。前もって感謝します!

答えて

12

。両方のサブシステムが同じクラスにある場合は、PopulateTextFields内のDoStuffを参照しようとしています。これは共有サブです。

これを達成するには、DoStuffをSharedとして宣言する必要があります。

+0

それが問題でした。ありがとうございました! – John

+0

私は1)これがいかに簡単か2)Google検索なしでこれを認識しなかったとは信じられません。ありがとう。 – CryptoJones

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 

期待どおりではないかもしれませんが、自分のタイプの別の参照を変更する専用メンバーを持つというあなたの意図は本当にわかりません。

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

をして、としてそれを呼び出す:

DoStuffへの署名を変更することが適切かもしれない、私は問題はサブルーチンDoStuffである思い

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

感謝クインチンに応答する申し訳ありませんが、どのメソッドがどこにあるのか不明でした。私のアプリケーションのDoStuffは、PopulateTextFieldsと同じスコープにあり、Stuffのメンバーメソッドではありませんでした。いずれにせよ、あなたは何か教えてくれました。 – John

3

これらの方法が属するタイプのを共有していません。あなたの混乱から、私はそれが "スタッフ"クラスの一部だと推測しています。しかし、それは本当に問題ではありません。あなたは2つのいずれかを忘れているように聞こえる:

  • は何とかそのインスタンスに共有方法を添付していない共有の方法で型のインスタンスを作成します。結局のところ、メソッド内に10個または1000個のインスタンスを作成することができます。

  • インスタンスをパラメータとして渡しても、関数はインスタンスに関連付けられません。パラメータはコールサイトではありません。

どちらの方法でも、インスタンス化されたコールサイトを提供することになります。 DoStuff関数はではなく、であるため、コンパイラは自分のタイプの特定のインスタンスによって提供される状態にアクセスする必要があると考えます。そのインスタンスはメソッドの呼び出しサイトです。あなたのいずれかがからを呼び出すために型のインスタンスを必要とする:SomeInstance.DoStuff(aStuff)またはの方法は本当にあなたがそれを共有マークし、このようにそれを呼び出す必要があり、あらゆるタイプの状態へのアクセスを必要としない場合:Stuff.DoStuff(aStuff)

+0

ジョエルにお返事ありがとうございます!私はあなたの答えからいくつかの事を学びました。 – John

関連する問題