多載解析度 (Visual Basic)
Visual Basic 編譯程式必須在定義了一個程序的數個多載版本時,決定要呼叫哪個多載版本。 它會藉由執行下列步驟來決定:
- 可及性。 它會排除任何具有存取層級的多載,以防止呼叫程式代碼呼叫它。
- 參數數目。 它可排除定義與呼叫中提供之不同參數數目的任何多載。
- 參數數據類型。 編譯器優先考慮實例方法而非擴充方法。 如果發現任何只需寬化轉換就能匹配程序調用的實例方法,則會忽略所有擴充方法。 編譯器將僅繼續使用實例方法候選項目。 如果找不到這類實例方法,則會繼續使用 實例和擴充方法。 在此步驟中,它會排除呼叫自變數數據類型無法轉換成多載中定義的參數類型的任何多載。
- 縮小轉換範圍。 它會排除任何需要從呼叫參數類型到已定義參數類型進行縮小轉換的重載。 不論類型檢查參數(Option Strict Statement)是
On
還是Off
,此步驟都會進行。 - 最小擴大。 編譯程式會將剩餘的多載視為成對。 針對每個配對,它會比較已定義參數的數據類型。 如果其中一個多載中的型別全都擴大至另一個中的對應型別,編譯程式就會排除後者。 也就是說,它會保留擴展量最小的重載。
- 超載解析優先權。 編譯器會移除任何 OverloadResolutionPriorityAttribute 低於候選多載中最高值的多載。 沒有此屬性的任何多載會指派預設值為零。
- 單一候選人。 它會持續考慮成對的多載,直到只剩下其中一個,並將呼叫解析為該多載。 如果編譯程式無法將多載縮減為單一候選專案,則會產生錯誤。
下列插圖顯示決定呼叫哪個多載版本的過程。
重載解析流程的
下列範例說明這個多載解析過程。
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
)。 因此,編譯程式會產生多載解析錯誤。
多載 Optional
和 ParamArray
自變數
如果一個程序的兩個多載具有相同的簽章,不同之處僅在於一個中的最後一個參數宣告為 選擇性,而另一個參數為 ParamArray,則編譯器會如下解析對該程序的呼叫:
如果函數呼叫提供最後一個引數作為 | 編譯程式會將對宣告最後一個自變數的多載呼叫解析為 |
---|---|
無值(參數省略) | Optional |
單一值 | Optional |
逗號分隔清單中的兩個或多個值 | ParamArray |
任何長度的陣列(包括空陣列) | ParamArray |