Compartir vía


Resolución de sobrecarga (Visual Basic)

Cuando el compilador de Visual Basic encuentra una llamada a un procedimiento definido en varias versiones sobrecargadas, el compilador debe decidir a cuál de las sobrecargas que se van a llamar. Esto lo hace realizando los siguientes pasos:

  1. Accesibilidad. Elimina cualquier sobrecarga con un nivel de acceso que impide que el código de llamada lo llame.

  2. Cantidad de parámetros. Elimina cualquier sobrecarga que defina un número diferente de parámetros que se proporcionan en la llamada.

  3. Tipos de datos de parámetro. El compilador da preferencia a los métodos de instancia sobre los métodos de extensión. Si se encuentra algún método de instancia que solo requiere conversiones de ampliación para que coincidan con la llamada al procedimiento, se quitan todos los métodos de extensión y el compilador continúa solo con los candidatos del método de instancia. Si no se encuentra ningún método de instancia, continúa con los métodos de instancia y extensión.

    En este paso, elimina cualquier sobrecarga para la que los tipos de datos de los argumentos de llamada no se pueden convertir en los tipos de parámetro definidos en la sobrecarga.

  4. Conversiones de restricción. Elimina cualquier sobrecarga que requiera una conversión de restricción de los tipos de argumento de llamada a los tipos de parámetro definidos. Esto es cierto si el modificador de comprobación de tipos (Instrucción Option Strict) es On o Off.

  5. Ampliación mínima. El compilador considera las sobrecargas restantes en pares. Para cada par, compara los tipos de datos de los parámetros definidos. Si los tipos de una de las sobrecargas amplían todos los tipos correspondientes en el otro, el compilador elimina el último. Es decir, conserva la sobrecarga que requiere la menor cantidad de ampliación.

  6. Candidato único. Continúa considerando sobrecargas en pares hasta que solo permanece una sobrecarga y resuelve la llamada a esa sobrecarga. Si el compilador no puede reducir las sobrecargas a un solo candidato, genera un error.

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

Flow diagram of overload resolution process

En el ejemplo siguiente se muestra el proceso de resolución de sobrecarga.

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 limita 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) amplía al tipo correspondiente en la tercera sobrecarga (Integer y Single). La segunda sobrecarga requiere menos ampliación, por lo que el compilador lo usa para la llamada.

En la segunda llamada, el compilador no puede eliminar ninguna de las sobrecargas en función de la restricción. Elimina la tercera sobrecarga por la misma razón que en la primera llamada, ya que puede llamar a la segunda sobrecarga con menos ampliación de los tipos de argumento. Sin embargo, el compilador no se puede resolver entre las sobrecargas primera y segunda. Cada tiene un tipo de parámetro definido que amplía al tipo correspondiente en el otro (Byte a Short, pero Single a Double). Por lo tanto, el compilador genera un error de resolución de sobrecarga.

Argumentos opcionales y paramArray sobrecargados

Si dos sobrecargas de un procedimiento tienen firmas idénticas, salvo que el último parámetro se declara Opcional en uno y ParamArray en el otro, el compilador resuelve una llamada a ese procedimiento como sigue:

Si la llamada proporciona el último argumento como El compilador resuelve la llamada a la sobrecarga declarando el último argumento como
Sin valor (argumento omitido) Optional
Un valor único Optional
Uno o dos valores en una lista separada por comas ParamArray
Matriz de cualquier longitud (incluida una matriz vacía) ParamArray

Consulte también