在 Visual Basic 中為變數進行疑難排解
本頁列出在 Visual Basic 中使用變數時所發生的一些常見問題。
無法存取物件的成員
如果程式碼嘗試存取物件的屬性 (Property) 或方法,則會有兩種可能的錯誤結果:
如果您宣告物件變數屬於特定型別,然後參考該型別未定義的成員,則編譯器會產生錯誤訊息。
當指派給物件變數的物件未公開 (Expose) 程式碼嘗試存取的成員時,會發生執行階段 MemberAccessException。 若為 Object 資料型別的變數,如果成員不是 Public,則您也會收到此例外狀況。 這是因為晚期繫結只允許存取 Public 成員。
當 Option Strict 陳述式將型別檢查設定為 On 時,物件變數僅能存取您用以宣告之類別的方法和屬性。 下列範例將說明這點。
Option Strict On
Dim p As Object = New System.Windows.Forms.Label
Dim q As System.Windows.Forms.Label = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler error.
j = p.Left
' The following statement retrieves the left edge of the label
' in pixels.
k = q.Left
在此範例中,p 僅能使用 Object 類別本身的成員,其並未包含 Left 屬性。 另一方面,將 q 宣告為 Label 型別,如此就可使用 System.Windows.Forms 命名空間內 Label 類別的所有方法和屬性。
正確的處理方法
若要能夠存取特定類別之物件的所有成員,可能的話請宣告物件變數屬於該類別的型別。 如果無法這麼做 (例如,在編譯時期不知道物件型別),您必須將 Option Strict 設定為 Off,並宣告變數為 Object 資料型別。 這會讓任何型別的物件都可以指派給該變數,而且您應該逐步確定目前指派的物件屬於可接受的型別。 您可以使用 TypeOf 運算子 (Visual Basic) 以進行這項決定。
其他元件無法存取您的變數
Visual Basic 名稱是「不區分大小寫」(Case-Insensitive)。 如果兩個名稱只有字母大小寫不同,則編譯器會將它們解譯成相同的名稱。 例如,編譯器會將 ABC 和 abc 視為相同的宣告項目。
不過,Common Language Runtime (CLR) 會使用「區分大小寫」(Case-Sensitive) 的繫結。 因此當您產生一個組件 (Assembly) 或 DLL 讓其他組件使用時,您的名稱將會區分大小寫。 例如,如果您使用名為 ABC 的項目來定義類別,而其他組件透過 Common Language Runtime 使用您的類別,則它們必須以 ABC 來表示該項目。 如果您隨後重新編譯類別,並將項目的名稱變更為 abc,則其他使用這個類別的組件就無法再存取該項目。 因此,當您公佈組件的更新版本時,不應該更改任何公用項目的字母大小寫。
如需詳細資訊,請參閱 Common Language Runtime (CLR)。
正確的處理方法
若要讓其他元件能夠存取您的變數,請將它們的名稱視為要區分大小寫。 當您正在測試類別或模組時,請確定其他組件都繫結至想要的變數。 一旦發行元件後,請勿修改現有的變數名稱,包括變更大小寫。
使用錯誤的變數
當您有一個以上同名的變數時,Visual Basic 編譯器會嘗試解析該名稱的每項參考。 如果變數具有不同的範圍,則編譯器會用最小的範圍來解析宣告的參考。 如果範圍相同,則解析會失敗且編譯器會發出錯誤信號。 如需詳細資訊,請參閱 已宣告之項目的參考 (Visual Basic)。
正確的處理方法
避免使用具有相同名稱但不同範圍的變數。 如果您正在使用其他組件或專案,請盡量避免使用這些外部元件所定義的名稱。 如果有一個以上的同名變數,請務必限定它的每項參考。 如需詳細資訊,請參閱 已宣告之項目的參考 (Visual Basic)。
請參閱
工作
HOW TO:決定物件變數參考的型別 (Visual Basic)