Resolução de sobrecarga (Visual Basic)
O compilador do Visual Basic deve decidir qual sobrecarga chamar quando um procedimento é definido em várias versões sobrecarregadas. Ele decide executando as seguintes etapas:
- Acessibilidade. Ele elimina qualquer sobrecarga com um nível de acesso que impede que o código de chamada o chame.
- Número de parâmetros. Ele elimina qualquer sobrecarga que define um número diferente de parâmetros dos fornecidos na chamada.
- Tipos de dados de parâmetro. O compilador fornece preferência de métodos de instância sobre métodos de extensão. Se algum método de instância for encontrado que exija apenas conversões de ampliação para corresponder à chamada de procedimento, todos os métodos de extensão serão descartados. O compilador continua com apenas os métodos de instância candidatos. Se nenhum método de instância for encontrado, ele continuará com métodos de instância e de extensão. Nesta etapa, ela elimina qualquer sobrecarga para a qual os tipos de dados dos argumentos de chamada não podem ser convertidos nos tipos de parâmetro definidos na sobrecarga.
- Conversões de restrição. Ele elimina qualquer sobrecarga que exija uma conversão de restrição dos tipos de argumento de chamada para os tipos de parâmetro definidos. Esta etapa ocorre independentemente de a opção de verificação de tipo (Option Strict Statement) ser
On
ouOff
. - Menor expansão. O compilador considera as sobrecargas restantes em pares. Para cada par, ele compara os tipos de dados dos parâmetros definidos. Se os tipos em uma das sobrecargas forem todos ampliados para os tipos correspondentes no outro, o compilador eliminará o último. Ou seja, ele mantém a sobrecarga que requer a menor expansão.
- Prioridade de Resolução de Sobrecarga. O compilador remove qualquer sobrecarga que tenha uma OverloadResolutionPriorityAttribute menor do que o valor mais alto entre as possíveis sobrecargas. Qualquer sobrecarga sem esse atributo recebe o valor padrão de zero.
- Candidato único. Ele continua considerando sobrecargas em pares até que apenas uma sobrecarga permaneça, e resolve a chamada para essa sobrecarga. Se o compilador não puder reduzir as sobrecargas para um único candidato, ele gerará um erro.
A ilustração a seguir mostra o processo que determina qual versão de um conjunto de versões sobrecarregadas será chamada.
diagrama de fluxo do processo de resolução de sobrecarga
O exemplo a seguir ilustra esse processo de resolução 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)
Na primeira chamada, o compilador elimina a primeira sobrecarga porque o tipo do primeiro argumento (Short
) se restringe ao tipo do parâmetro correspondente (Byte
). Em seguida, elimina a terceira sobrecarga porque cada tipo de argumento na segunda sobrecarga (Short
e Single
) aumenta para o tipo correspondente na terceira sobrecarga (Integer
e Single
). A segunda sobrecarga requer menos expansão, portanto, o compilador a usa para a chamada.
Na segunda chamada, o compilador não pode eliminar nenhuma das sobrecargas com base na restrição. Ele elimina a terceira sobrecarga pelo mesmo motivo que na primeira chamada, pois pode chamar a segunda sobrecarga com menos expansão dos tipos de argumento. No entanto, o compilador não pode resolver entre a primeira e a segunda sobrecargas. Cada um tem um tipo de parâmetro definido que é ampliado para o tipo correspondente no outro (Byte
para Short
, mas Single
para Double
). Portanto, o compilador gera um erro de resolução de sobrecarga.
Argumentos de Optional
e ParamArray
sobrecarregados
Se duas sobrecargas de um procedimento tiverem assinaturas idênticas, exceto que o último parâmetro será declarado Opcional em um e ParamArray no outro, o compilador resolverá uma chamada para esse procedimento conforme segue:
Se a chamada fornecer o último argumento como | O compilador resolve a chamada para a sobrecarga declarando o último argumento como |
---|---|
Nenhum valor (argumento omitido) | Optional |
Um único valor | Optional |
Dois ou mais valores em uma lista separada por vírgulas | ParamArray |
Uma matriz de qualquer comprimento (incluindo uma matriz vazia) | ParamArray |
Consulte também
- parâmetros opcionais
- Matrizes de Parâmetros
- Sobrecarga de procedimento
- Solução de problemas de Procedimentos
- Como definir várias versões de um procedimento
- Como chamar um procedimento sobrecarregado
- Como sobrecarregar um procedimento que usa parâmetros opcionais
- Como sobrecarregar um procedimento que usa um número indefinido de parâmetros
- Considerações sobre procedimentos de sobrecarga
- Sobrecargas
- Métodos de Extensão