Resolução de sobrecarga (Visual Basic)
Quando o compilador Visual Basic encontra uma chamada a um procedimento que está definido em várias versões sobrecarregadas, o compilador deve decidir qual dos sobrecarregamentos chamar.Faz-se isso realizando os seguintes passos:
Acessibilidade. Elimina qualquer sobrecarregamento com um nível de acesso que impede que o código de chamada o chame.
Número de Parâmetros. Elimina qualquer sobrecarregamento que define um número diferente de parâmetros que são fornecidos na chamada.
Tipos de dados de parâmetro. O compilador dá preferência de métodos de instância sobre métodos de extensão.Se qualquer método de instância for encontrado que requer somente conversões para coincidir com a chamada de procedimento de expansão, todos os métodos de extensão são descartados e o compilador continua com apenas os candidatos de método de instância.Se nenhum desses métodos de instância for encontrado, ele continua com os métodos de extensão e de instância.
Nesta etapa, ele elimina qualquer sobrecarga para os quais os tipos de dados dos argumentos de chamada não podem ser convertidos para os tipos de parâmetro definidos na sobrecarga.
Conversões explicitas de restrição. Elimina qualquer sobrecarregamento que exige uma conversão de estreitamento dos tipos de argumento de chamada ao tipos definidos de parâmetro.Isto é verdadeiro se o interruptor de verificação de tipo (Opção Strict Statement) estiver na posição On ou Off.
Alargamento Mínimo. O compilador considera os restantes métodos sobrecarregados em pares.Para cada par, compara o tipo de dados dos parâmetros definidos.Se os tipos em um dos sobrecarregamentos todos alargam para os tipos correspondentes no outro, o compilador elimina o último.Ou seja, ele retém a sobrecarga que requer o mínimo de ampliação.
Candidato Único. Continua considerando sobrecarregamentos em pares até que reste apenas um sobrecarregamento, e resolve a chamada para aquele sobregarregamento.Se o compilador não pode reduzir os sobrecarregamentos a um candidato único, ele gera um erro.
A ilustração a seguir mostra o processo que determina qual chamar de um conjunto de versões sobrecarregadas.
Resolução entre versões sobrecarregadas
O exemplo a seguir ilustra este processo de resolução de sobrecarregamento.
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)
Na primeira chamada, o compilador elimina o primeiro sobrecarregamento porque o tipo do primeiro argumento (Short) estreita ao tipo do parâmetro correspondente (Byte).Então elimina o terceiro sobrecarregamento porque cada tipo de argumento no segundo sbrecarregamento (Short e Single) alarga ao tipo correspondente no terceiro sobrecarregamento (Integer e Single).O segundo sobrecarregamento requer menos alargamento, então o compilador usa-o para a chamada.
Na segunda chamada, o compilador não pode eliminar qualquer dos sobrecarregamentos na base do estreitamento.Elimina o terceiro sobrecarregamento pela mesma razão que na primeira chamada, porque pode chamar o segundo sobrecarregamento com menos alargamento de tipos de argumento.Entretanto, o compilador não pode resolver entre o primeiro e segundo sobrecarregamentos.Cada um possui tipo definido de parâmetro que alarga para o tipo correspondente no outro (Byte a Short, mas Single a Double).O compilador, por isso, gera um erro de resolução de sobrecarregamento.
Argumentos Overloaded Optional e ParamArray
Se dois sobrecarregamentos de um procedimento possuem assinaturas idênticas exceto que o último parâmetro é declarado Opcional (Visual Basic) em um e ParamArray (Visual Basic) no outro, o compilador resolve uma chamada para aquele procedimento como se segue:
Se a chamada fornecer o último argumento como |
O compilador resolve a chamada ao sobrecarregamento declarando o último argumento como |
Nenhum valor (argumento omitido) |
Optional |
Um valor único |
Optional |
Dois ou mais valores numa lista separada por vírgula |
ParamArray |
Uma matriz de qualquer comprimento (incluindo uma matriz vazia) |
ParamArray |
Consulte também
Tarefas
Procedimentos de solução de problemas (Visual Basic)
Como: definir várias versões de um procedimento (Visual Basic)
Como: chamar um procedimento sobrecarregado (Visual Basic)
Como: um procedimento que usa parâmetros opcionais (Visual Basic) de sobrecarga.
Como: um procedimento que leva a um número indefinido de parâmetros (Visual Basic) de sobrecarga.
Referência
Conceitos
Parâmetros opcionais (Visual Basic)
Matrizes de parâmetros (Visual Basic)
Procedimento de sobrecarga (Visual Basic)
Considerações sobre a sobrecarga de procedimentos (Visual Basic)