共用方式為


多載解析 (Visual Basic)

Visual Basic 編譯器遇到數個多載版本中定義的程序呼叫時,編譯器必須決定要呼叫哪些多載。 這會執行下列步驟來執行此動作:

  1. 協助工具。 這會排除任何具有存取層級的多載,以避免呼叫程式碼呼叫這種多載。

  2. 參數數目。 這會排除定義的參數數目與呼叫中所提供參數數目不同的任何多載。

  3. 參數資料類型。 編譯器會提供執行個體方法喜好設定,而非擴充方法。 如果發現任何需要放大轉換才能符合程序呼叫的執行個體方法,則會捨棄所有擴充方法,編譯器也只會繼續使用執行個體方法的候選項目。 如果找不到這類執行個體方法,則會繼續使用執行個體和擴充方法。

    在此步驟中,如果呼叫引數的資料類型無法轉換成多載中定義的參數型別,則會排除任何多載。

  4. 縮小轉換。 如果任何多載需要從呼叫引數型別至已定義參數型別的縮小轉換,則會排除任何多載。 無論類型檢查參數交換 (Option Strict 陳述式) 為OnOff,都是如此。

  5. 最小放大。 編譯器會將剩餘的多載視為配對。 針對每個配對,這會對於定義的參數比較參數的資料類型。 如果其中一個多載中的型別全部放大為另一個多載所對應型別,則編譯器就會消除後者。 也就是說,這會保留需要最小放大數量的多載。

  6. 單一候選項目。 它會繼續考量成對的多載,直到只保留一個多載為止,並解析其多載的呼叫。 如果編譯器無法將多載縮減為單一候選項目,則會產生錯誤。

下圖顯示決定要呼叫哪一組多載版本的流程。

Flow diagram of overload resolution process

下列範例說明這個多載解析流程。

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)

在第一次呼叫中,編譯器會消除第一個多載,因為第一個引數的型別 (Short) 縮小至對應參數的型別 (Byte)。 然後這會消除第三個多載,因為第二個多載 (ShortSingle) 中的每個引數型別放大到第三個多載 (IntegerSingle) 中的對應型別。 第二個多載需要較少的擴展,因此編譯器會使用它進行呼叫。

在第二次呼叫中,編譯器無法根據縮小而消除任何多載。 這會因為與第一次呼叫相同的原因而消除第三個多載,因為這可以呼叫第二個多載,而且引數型別的放大較少。 不過,編譯器無法在第一個和第二個多載之間解析。 每個多載都有一個定義的參數型別,這會擴大為另一個多載中的對應型別 (Byte擴大為Short,但Single擴大為Double)。 因此,編譯器會產生多載解析錯誤。

多載選擇性和 ParamArray 引數

如果程序的兩個多載具有相同的簽章,不同之處在於最後一個參數在一個多載中宣告為 Optional,並在另一個多載中宣告為 ParamArray,則編譯器會解析該程序的呼叫,如下所示:

如果呼叫提供最後一個引數為 編譯器會將對宣告最後一個引數的多載呼叫解析為
沒有值 (省略的引數) Optional
單一值 Optional
以逗號分隔清單中的兩個或多個值 ParamArray
任何長度的陣列 (包括空陣列) ParamArray

另請參閱