Résolution de surcharge (Visual Basic)

Lorsque le compilateur Visual Basic rencontre un appel à une procédure définie dans plusieurs versions surchargées, le compilateur doit décider laquelle des surcharges appeler. Pour cela, procédez comme suit :

  1. Accessibilité. Il élimine toute surcharge avec un niveau d’accès qui empêche le code appelant de l’appeler.

  2. Nombre de paramètres. Il élimine toute surcharge qui définit un nombre de paramètres différent de celui fourni dans l’appel.

  3. Types de données de paramètre. Le compilateur privilégie les méthodes d'instance aux méthodes d’extension. Si une méthode d’instance est trouvée qui nécessite uniquement des conversions étendues pour correspondre à l’appel de procédure, toutes les méthodes d’extension sont supprimées et le compilateur continue avec uniquement les candidats de méthode instance. Si aucune méthode d’instance de ce type n’est trouvée, elle continue avec les méthodes d’instance et d’extension.

    Dans cette étape, il élimine toute surcharge pour laquelle les types de données des arguments appelants ne peuvent pas être convertis en types de paramètres définis dans la surcharge.

  4. Conversions restrictives. Il élimine toute surcharge qui nécessite une conversion restrictive des types d’arguments appelants vers les types de paramètres définis. Cela est vrai, que le commutateur de vérification de type (Option Strict Statement) soit On ou Off.

  5. Le moins d’élargissement. Le compilateur prend en compte les surcharges restantes en paires. Pour chaque paire, il compare les types de données des paramètres définis. Si les types dans l’une des surcharges s’étendent tous aux types correspondants dans l’autre, le compilateur élimine ces derniers. Autrement dit, il conserve la surcharge qui nécessite le moins d’élargissement.

  6. Candidat unique. Il continue à considérer les surcharges par paires jusqu’à ce qu’il ne reste qu’une seule surcharge, et il résout l’appel à cette surcharge. Si le compilateur ne peut pas réduire les surcharges à un seul candidat, il génère une erreur.

L’illustration suivante montre le processus qui détermine laquelle d’un ensemble de versions surchargées à appeler.

Flow diagram of overload resolution process

L'exemple suivant illustre ce processus de résolution de surcharge.

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)

Dans le premier appel, le compilateur élimine la première surcharge, car le type du premier argument (Short) est restreint au type du paramètre correspondant (Byte). Il élimine ensuite la troisième surcharge, car chaque type d’argument dans la deuxième surcharge (Short et Single) s’étend sur le type correspondant dans la troisième surcharge (Integer et Single). La deuxième surcharge nécessite moins d’élargissement, de sorte que le compilateur l’utilise pour l’appel.

Dans le deuxième appel, le compilateur ne peut pas éliminer les surcharges sur la base d’un rétrécissement. Il élimine la troisième surcharge pour la même raison que dans le premier appel, car elle peut appeler la deuxième surcharge avec moins d’élargissement des types d’arguments. Toutefois, le compilateur ne peut pas résoudre entre les premières et deuxième surcharges. Chacun a un type de paramètre défini qui s’élargit au type correspondant dans l’autre (Byte à Short, mais Single à Double). Le compilateur génère donc une erreur de résolution de surcharge.

Arguments facultatifs et ParamArray surchargés

Si deux surcharges d’une procédure ont des signatures identiques, sauf que le dernier paramètre est déclaré Facultatif dans l’un et ParamArray dans l’autre, le compilateur résout un appel à cette procédure comme suit :

Si l’appel fournit le dernier argument en tant que Le compilateur résout l’appel à la surcharge en déclarant le dernier argument comme
Aucune valeur (argument omis) Optional
une valeur unique Optional
Entrez les valeurs dans une liste séparée par des virgules ParamArray
Tableau de n’importe quelle longueur (y compris un tableau vide) ParamArray

Voir aussi