Överbelastningsmatchning (Visual Basic)
När Visual Basic-kompilatorn stöter på ett anrop till en procedur som definieras i flera överlagrade versioner måste kompilatorn bestämma vilken av överlagringarna som ska anropas. Det gör du genom att utföra följande steg:
Tillgänglighet. Det eliminerar all överbelastning med en åtkomstnivå som förhindrar att den anropande koden anropar den.
Antal parametrar. Den eliminerar all överbelastning som definierar ett annat antal parametrar än vad som anges i anropet.
Parameterdatatyper. Kompilatorn ger instansmetoder företräde framför tilläggsmetoder. Om någon instansmetod hittas som bara kräver bredare konverteringar för att matcha proceduranropet, tas alla tilläggsmetoder bort och kompilatorn fortsätter endast med instansmetodens kandidater. Om ingen sådan instansmetod hittas fortsätter den med både instans- och tilläggsmetoder.
I det här steget eliminerar den all överlagring som datatyperna för de anropande argumenten inte kan konverteras till de parametertyper som definierats i överlagringen.
Begränsa konverteringar. Den eliminerar all överbelastning som kräver en begränsad konvertering från de anropande argumenttyperna till de definierade parametertyperna. Detta gäller oavsett om typkontrollväxeln (Alternativ strikt instruktion) är
On
ellerOff
.Minst breddning. Kompilatorn tar hänsyn till de återstående överlagringarna i par. För varje par jämförs datatyperna för de definierade parametrarna. Om typerna i en av överlagringarna vidgas till motsvarande typer i den andra, eliminerar kompilatorn det senare. Det innebär att den behåller den överbelastning som kräver minst breddning.
Enskild kandidat. Det fortsätter att överväga överlagringar i par tills endast en överlagring finns kvar, och det löser anropet till den överlagringen. Om kompilatorn inte kan minska överbelastningarna till en enskild kandidat genererar den ett fel.
Följande bild visar den process som avgör vilken av en uppsättning överlagrade versioner som ska anropas.
I följande exempel visas den här överbelastningsmatchningsprocessen.
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)
I det första anropet eliminerar kompilatorn den första överlagringen eftersom typen av det första argumentet (Short
) begränsas till typen av motsvarande parameter (Byte
). Den eliminerar sedan den tredje överlagringen eftersom varje argumenttyp i den andra överlagringen (Short
och Single
) vidgas till motsvarande typ i den tredje överlagringen (Integer
och Single
). Den andra överlagringen kräver mindre breddning, så kompilatorn använder den för anropet.
I det andra anropet kan kompilatorn inte eliminera någon av överlagringarna på grundval av en minskning. Den eliminerar den tredje överbelastningen av samma anledning som i det första anropet, eftersom den kan anropa den andra överbelastningen med mindre breddning av argumenttyperna. Kompilatorn kan dock inte matcha mellan den första och andra överlagringen. Var och en har en definierad parametertyp som vidgas till motsvarande typ i den andra (Byte
till Short
, men Single
till Double
). Kompilatorn genererar därför ett överbelastningsmatchningsfel.
Överlagrade valfria argument och ParamArray-argument
Om två överlagringar av en procedur har identiska signaturer förutom att den sista parametern har deklarerats som Valfri i den ena och ParamArray i den andra, löser kompilatorn ett anrop till proceduren enligt följande:
Om anropet anger det sista argumentet som | Kompilatorn löser anropet till överlagringen som deklarerar det sista argumentet som |
---|---|
Inget värde (argumentet utelämnas) | Optional |
Ett enda värde | Optional |
Två eller flera värden i en kommaavgränsad lista | ParamArray |
En matris med valfri längd (inklusive en tom matris) | ParamArray |
Se även
- Valfria parametrar
- Parametermatriser
- Överlagring av procedur
- Felsökningsprocedurer
- Anvisningar: Definiera flera versioner av en procedur
- Anvisningar: Anropa en överbelastad procedur
- Gör så här: Överbelasta en procedur som tar valfria parametrar
- Anvisningar: Överbelasta en procedur som tar ett obegränsat antal parametrar
- Överväganden i överlagringsprocedurer
- Överbelastning
- Tilläggsmetoder