Resolução de Sobrecarregamento

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:

  1. Acessibilidade. Elimina qualquer sobrecarregamento com um nível de acesso que impede que o código de chamada o chame.

  2. Número de Parâmetros. Elimina qualquer sobrecarregamento que define um número diferente de parâmetros que são fornecidos na chamada.

  3. Tipos de Dados de Parâmetro. O compilador dá preferência de métodos de instância sobre os métodos de extensão.Se for encontrado nenhum método de instância que exija somente alargamento conversões para atender a telefonar de procedimento, todos os métodos de extensão são descartados e o compilador continua com apenas os candidatos de método de instância.Não se for encontrado nenhum método tal instância, ele continua com a instância e os métodos de extensão.

    Nesta etapa, ele elimina qualquer sobrecarga para os quais os tipos de dados dos argumentos de chamada não podem ser convertidos nos tipos de parâmetro definidos na sobrecarga.

  4. Conversões de Estreitamento. 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 declaração estrito) estiver na posição On ou Off.

  5. 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 expansão.

  6. 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 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

Solucionando problemas de procedimentos

Como: Definir diversas versões de um procedimento

Como: Chamar um procedimento sobrecarregado

Como: Um procedimento que tem parâmetros opcionais de sobrecarga

Como: Um procedimento que tem um número indefinida de parâmetros de sobrecarga

Conceitos

Parâmetros Opcionais

Matrizes de parâmetro

Sobrecarga de procedimento

Considerações sobre Procedimentos de Sobrecarga

Métodos de extensão (Visual Basic)

Referência

Sobrecargas