2009-10-22 23 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

認爲的問題在於子程序DoStuff。如果你的兩個子文件位於同一個類中,你試圖從PopulateTextFields中引用DoStuff,這是一個共享子文件。

爲了達到這個目的,您還需要將DoStuff聲明爲Shared。

+0

這是問題所在。謝謝! – John 2009-10-23 02:58:27

+0

我不敢相信1)這很容易,2)我沒有意識到這一點,沒有谷歌搜索。謝謝你。 – CryptoJones 2016-01-22 17:23:43

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 

它應該能夠工作,但可能並不像預期的那樣,我並不真正知道你有一個私人成員來處理改變它自己類型的單獨引用的意圖。

它可適當改變DoStuff到簽名:

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

,然後將其稱爲:

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

謝謝爲了迴應Quintin。對不起,我不清楚哪些方法是在哪裏:我的應用程序中的DoStuff與PopulateTextFields的範圍相同,而不是Stuff的成員方法。無論如何,你教了我一些東西。 – John 2009-10-23 02:57:57

3

您沒有分享其中類型這些方法屬於。從你的困惑中,我猜這是「Stuff」類的一部分。但這並不重要。這聽起來像你忘的兩兩件事之一:

  • 共享方法創建類型的實例不共享方法在某種程度上附加到該實例。畢竟,您可以在方法中創建10個或1000個實例。

  • 將實例作爲參數傳遞不會將該函數與實例相關聯。參數不是呼叫站點。

無論哪種方式,它歸結爲提供一個實例化的呼叫站點。您的DoStuff函數是而不是共享的,因此編譯器認爲它需要訪問由您的類型的特定實例提供的狀態。該實例是該方法的調用站點。你要麼需要的類型的實例,從稱之爲SomeInstance.DoStuff(aStuff)如果方法並不真正需要,你需要將其標記共享和調用它的任何類型的國家訪問:Stuff.DoStuff(aStuff)

+0

感謝您回答喬爾!我從你的答案中學到了一些東西。 – John 2009-10-23 03:00:20