多載解析 (Visual Basic)
Visual Basic 編譯器遇到數個多載版本中定義的程序呼叫時,編譯器必須決定要呼叫哪些多載。 這會執行下列步驟來執行此動作:
協助工具。 這會排除任何具有存取層級的多載,以避免呼叫程式碼呼叫這種多載。
參數數目。 這會排除定義的參數數目與呼叫中所提供參數數目不同的任何多載。
參數資料類型。 編譯器會提供執行個體方法喜好設定,而非擴充方法。 如果發現任何需要放大轉換才能符合程序呼叫的執行個體方法,則會捨棄所有擴充方法,編譯器也只會繼續使用執行個體方法的候選項目。 如果找不到這類執行個體方法,則會繼續使用執行個體和擴充方法。
在此步驟中,如果呼叫引數的資料類型無法轉換成多載中定義的參數型別,則會排除任何多載。
縮小轉換。 如果任何多載需要從呼叫引數型別至已定義參數型別的縮小轉換,則會排除任何多載。 無論類型檢查參數交換 (Option Strict 陳述式) 為
On
或Off
,都是如此。最小放大。 編譯器會將剩餘的多載視為配對。 針對每個配對,這會對於定義的參數比較參數的資料類型。 如果其中一個多載中的型別全部放大為另一個多載所對應型別,則編譯器就會消除後者。 也就是說,這會保留需要最小放大數量的多載。
單一候選項目。 它會繼續考量成對的多載,直到只保留一個多載為止,並解析其多載的呼叫。 如果編譯器無法將多載縮減為單一候選項目,則會產生錯誤。
下圖顯示決定要呼叫哪一組多載版本的流程。
下列範例說明這個多載解析流程。
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
)。 然後這會消除第三個多載,因為第二個多載 (Short
和Single
) 中的每個引數型別放大到第三個多載 (Integer
和Single
) 中的對應型別。 第二個多載需要較少的擴展,因此編譯器會使用它進行呼叫。
在第二次呼叫中,編譯器無法根據縮小而消除任何多載。 這會因為與第一次呼叫相同的原因而消除第三個多載,因為這可以呼叫第二個多載,而且引數型別的放大較少。 不過,編譯器無法在第一個和第二個多載之間解析。 每個多載都有一個定義的參數型別,這會擴大為另一個多載中的對應型別 (Byte
擴大為Short
,但Single
擴大為Double
)。 因此,編譯器會產生多載解析錯誤。
多載選擇性和 ParamArray 引數
如果程序的兩個多載具有相同的簽章,不同之處在於最後一個參數在一個多載中宣告為 Optional,並在另一個多載中宣告為 ParamArray,則編譯器會解析該程序的呼叫,如下所示:
如果呼叫提供最後一個引數為 | 編譯器會將對宣告最後一個引數的多載呼叫解析為 |
---|---|
沒有值 (省略的引數) | Optional |
單一值 | Optional |
以逗號分隔清單中的兩個或多個值 | ParamArray |
任何長度的陣列 (包括空陣列) | ParamArray |