Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um procedimento genérico, também chamado de método genérico, é um procedimento definido com pelo menos um parâmetro de tipo. Isso permite que o código de chamada adapte os tipos de dados aos seus requisitos sempre que ele chama o procedimento.
Um procedimento não é genérico simplesmente em virtude de ser definido dentro de uma classe genérica ou uma estrutura genérica. Para ser genérico, o procedimento deve usar pelo menos um parâmetro de tipo, além de quaisquer parâmetros normais que possa ser necessário. Uma classe ou estrutura genérica pode conter procedimentos não genéricos, e uma classe, estrutura ou módulo não genérico pode conter procedimentos genéricos.
Um procedimento genérico pode usar seus parâmetros de tipo em sua lista de parâmetros normal, em seu tipo de retorno, se ele tiver um e em seu código de procedimento.
Inferência de tipos
Você pode chamar um procedimento genérico sem fornecer nenhum argumento de tipo. Se você chamá-lo dessa forma, o compilador tentará determinar os tipos de dados apropriados para passar para os argumentos de tipo do procedimento. Isso é chamado inferência de tipo. O código a seguir mostra uma chamada na qual o compilador infere que ele deve passar o tipo String para o parâmetro tde tipo.
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Se o compilador não puder inferir os argumentos de tipo do contexto da sua chamada, ele relatará um erro. Uma possível causa desse erro é uma incompatibilidade de nível de matriz. Por exemplo, suponha que você defina um parâmetro normal como uma matriz de um parâmetro de tipo. Se você chamar o procedimento genérico que fornece uma matriz de uma classificação diferente (número de dimensões), a incompatibilidade fará com que a inferência de tipo falhe. O código a seguir mostra uma chamada na qual uma matriz bidimensional é passada para um procedimento que espera uma matriz unidimensional.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
Você pode invocar inferência de tipo apenas omitindo todos os argumentos de tipo. Se você fornecer um argumento de tipo, deverá fornecê-los todos.
Há suporte para inferência de tipo apenas para procedimentos genéricos. Você não pode invocar inferência de tipo em classes genéricas, estruturas, interfaces ou delegados.
Exemplo
Descrição
O exemplo a seguir define um procedimento genérico Function para localizar um elemento específico em uma matriz. Ele define um parâmetro de tipo e o usa para construir os dois parâmetros na lista de parâmetros.
Código
Public Function findElement(Of T As IComparable) (
ByVal searchArray As T(), ByVal searchValue As T) As Integer
If searchArray.GetLength(0) > 0 Then
For i As Integer = 0 To searchArray.GetUpperBound(0)
If searchArray(i).CompareTo(searchValue) = 0 Then Return i
Next i
End If
Return -1
End Function
Comentários
O exemplo anterior requer a capacidade de comparar searchValue com cada elemento de searchArray. Para garantir essa capacidade, ele restringe o parâmetro T de tipo para implementar a IComparable<T> interface. O código usa o CompareTo método em vez do = operador, pois não há nenhuma garantia de que um argumento de tipo fornecido dê T suporte ao = operador.
Você pode testar o findElement procedimento com o código a seguir.
Public Sub tryFindElement()
Dim stringArray() As String = {"abc", "def", "xyz"}
Dim stringSearch As String = "abc"
Dim integerArray() As Integer = {7, 8, 9}
Dim integerSearch As Integer = 8
Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub
As chamadas anteriores para MsgBox exibem "0", "1" e "-1", respectivamente.