Dela via


Ö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:

  1. Tillgänglighet. Det eliminerar all överbelastning med en åtkomstnivå som förhindrar att den anropande koden anropar den.

  2. Antal parametrar. Den eliminerar all överbelastning som definierar ett annat antal parametrar än vad som anges i anropet.

  3. 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.

  4. 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 eller Off.

  5. 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.

  6. 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.

Flow diagram of overload resolution process

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