Resolución de sobrecargas

Actualización: noviembre 2007

Cuando el compilador de Visual Basic encuentra una llamada a un procedimiento que está definido en varias versiones sobrecargadas, debe decidir a qué sobrecarga tiene que llamar. Para ello, sigue estos pasos:

  1. Accesibilidad. Elimina cualquier sobrecarga con un nivel de acceso que impida que el código de llamada pueda invocarla.

  2. Número de parámetros. Elimina cualquier sobrecarga que defina un número de parámetros que no coincida con los que se suministran en la llamada.

  3. **Tipos de datos de parámetros.**El compilador da prioridad a los métodos de instancia sobre los métodos de extensión. Si se encuentra un método de instancia que exige sólo conversiones de ampliación que coincidan con la llamada al procedimiento, se descartan todos los métodos de extensión y el compilador sigue sólo con los candidatos del método de instancia. Si no se encuentra ningún método de instancia de este tipo, sigue con ambos métodos de instancia y de extensión.

    En esta fase, elimina cualquier sobrecarga para la que los tipos de datos de los argumentos de llamada no se pueden convertir a los tipos definidos en la sobrecarga.

  4. Conversiones de restricción. Elimina cualquier sobrecarga que requiera una conversión de restricción de los tipos de argumentos de llamada a los tipos de parámetros definidos. Esto se aplica si el modificador de comprobación de tipo (Option Strict (Instrucción)) es On u Off.

  5. Ampliación mínima. El compilador considera las sobrecargas restantes en parejas. En cada pareja, compara los tipos de datos de los parámetros definidos. Si los tipos de una de las sobrecargas se amplían a los tipos correspondientes de la otra, el compilador elimina la última. Es decir, conserva la sobrecarga que necesite la menor cantidad de ampliación.

  6. Candidata única. Continúa considerando las sobrecargas por partes hasta que sólo quede una y resuelve la llamada en esa sobrecarga. Si el compilador no puede reducir las sobrecargas a una sola candidata, genera un error.

La ilustración siguiente muestra el proceso que determina a qué conjunto de versiones sobrecargadas se va a llamar.

Resolver entre versiones sobrecargadas

Este proceso de resolución de las sobrecargas se ilustra en el siguiente ejemplo:

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)

En la primera llamada, el compilador elimina la primera sobrecarga porque el tipo del primer argumento (Short) se restringe al tipo del parámetro correspondiente (Byte). A continuación, elimina la tercera sobrecarga porque cada tipo de argumento de la segunda sobrecarga (Short y Single) se amplía al tipo correspondiente a la tercera sobrecarga (Integer y Single). La segunda sobrecarga requiere una ampliación menor, y por eso el compilador la utiliza en la llamada.

En la segunda llamada, el compilador no puede eliminar ninguna sobrecarga teniendo en cuenta la restricción. Elimina la tercera sobrecarga por el mismo motivo por el que la eliminó en la primera llamada, porque puede llamar a la segunda sobrecarga con una ampliación menor de los tipos de argumentos. Sin embargo, el compilador no puede decidirse entre la primera y la segunda sobrecarga. Cada una de ellas tiene un tipo de parámetro definido que se amplía al tipo correspondiente de la otra (Byte a Short, pero Single a Double). Por lo tanto, el compilador genera un error de resolución de sobrecarga.

Argumentos opcionales sobrecargados y ParamArray

Si dos sobrecargas de un procedimiento tienen firmas idénticas excepto en que el último argumento se declara Optional (Visual Basic) en una sobrecarga y ParamArray en la otra, el compilador resuelve la llamada a dicho procedimiento de la manera siguiente:

Si la llamada suministra el último argumento como

El compilador resuelve la llamada a la sobrecarga declarando el último argumento como

Ningún valor (argumento omitido)

Optional

Un valor único

Optional

Dos o más valores en una lista separada por comas

ParamArray

Una matriz de cualquier longitud (incluida una matriz vacía)

ParamArray

Vea también

Tareas

Procedimientos de solución de problemas

Cómo: Definir varias versiones de un procedimiento

Cómo: Llamar a un procedimiento sobrecargado

Cómo: Sobrecargar un procedimiento que toma parámetros opcionales

Cómo: Sobrecargar un procedimiento que toma un número indefinido de parámetros

Conceptos

Parámetros opcionales

Matrices de parámetros

Sobrecarga de procedimientos

Consideraciones sobre la sobrecarga de procedimientos

Métodos de extensión (Visual Basic)

Referencia

Overloads