Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El compilador de Visual Basic debe decidir qué sobrecarga debe invocar cuando se define un procedimiento en varias versiones sobrecargadas. Decide mediante los pasos siguientes:
- Accesibilidad. Elimina cualquier sobrecarga con un nivel de acceso que impide que el código de llamada lo llame.
- Número de parámetros. Elimina cualquier sobrecarga que defina un número diferente de parámetros de los proporcionados en la llamada.
- Tipos de datos de parámetros. El compilador proporciona preferencia a los métodos de instancia sobre los métodos de extensión. Si se encuentra algún método de instancia que requiere solo conversiones de ampliación para que coincidan con la llamada al procedimiento, se quitan todos los métodos de extensión. El compilador continúa solo con los candidatos del método de instancia. Si no se encuentra ningún método de instancia de este tipo, 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.
- 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. Este paso tiene lugar independientemente de si el modificador de comprobación de tipos (Instrucción Option Strict) es
On
oOff
. - 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.
- Prioridad de resolución de sobrecarga. El compilador quita cualquier sobrecarga que tenga un OverloadResolutionPriorityAttribute menor que el valor más alto en las sobrecargas candidatas. A cualquier sobrecarga sin este atributo se le asigna el valor predeterminado de cero.
- 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.
diagrama de flujo de
En el ejemplo siguiente se muestra este proceso de resolución de sobrecargas.
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 basadas en el estrechamiento. 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 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.
Sobrecarga en los argumentos Optional
y ParamArray
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 |
---|---|
Ningún valor (argumento omitido) | Optional |
Valor único | Optional |
Dos o más valores de una lista separada por comas | ParamArray |
Matriz de cualquier longitud (incluida una matriz vacía) | ParamArray |
Consulte también
- parámetros opcionales
- Matrices de parámetros
- Sobrecarga de procedimientos
- procedimientos de solución de problemas
- Cómo: Definir varias versiones de un procedimiento
- Procedimiento: Llamada 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
- Consideraciones sobre la sobrecarga de procedimientos
- Sobrecargas
- Métodos de extensión