Share via


Procedimientos genéricos en Visual Basic

Actualización: noviembre 2007

Un procedimiento genérico, también denominado método genérico, es el que está definido con al menos un parámetro de tipo. Esto permite que el código de llamada ajuste los tipos de datos a sus requisitos cada vez que llama al procedimiento.

El simple hecho de estar definido dentro de una clase o estructura genérica no convierte en genérico al procedimiento. Para ser genérico, el procedimiento debe tomar por lo menos un parámetro de tipo, además de cualquier otro parámetro normal que pueda a tomar. Una clase o estructura genérica puede contener procedimientos que no sean genéricos; y las clases, estructuras o módulos no genéricos pueden contener procedimientos genéricos.

Un procedimiento genérico puede utilizar los parámetros de tipo en su lista de parámetros normales, en su tipo de valor devuelto, si existe, y en su código de procedimiento.

Inferencia de tipo

Puede llamar a un procedimiento genérico sin proporcionar ningún argumento de tipo. Al llamar de este modo, el compilador intenta determinar los tipos de datos adecuados para pasar los argumentos de tipo del procedimiento. Esto se denomina inferencia de tipo. El código siguiente muestra una llamada en la que el compilador deduce que debe pasar el tipo String al parámetro de tipo t.

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

Si el compilador no puede deducir los argumentos de tipo del contexto de su llamada, crea un informe de error. Una posible causa de este tipo de error es la falta de coincidencia del rango de matriz. Por ejemplo, suponga que define un parámetro normal como matriz de un parámetro de tipo. Si se llama al procedimiento genérico proporcionando una matriz de distinto rango (número de dimensiones), la desigualdad provoca que se produzca un error en la inferencia de tipo. En el código siguiente se muestra una llamada en la que se pasa una matriz bidimensional a un procedimiento que espera una matriz unidimensional.

Public Sub demoSub(Of t)(ByVal arg() As t)

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Sólo se puede invocar la inferencia de tipo omitiendo todos los argumentos de tipo. Si proporciona alguno, debe proporcionarlos todos.

La inferencia de tipo sólo se admite para los procedimientos genéricos. No puede invocar la inferencia de tipo en las clases, estructuras, interfaces o delegados genéricos.

Ejemplo

Descripción

En el ejemplo siguiente se define un procedimiento genérico Function para encontrar un elemento concreto en una matriz. Se define un parámetro de tipo, que se utiliza para construir los dos parámetros de la 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

Comentarios

Para el ejemplo anterior es necesario poder comparar searchValue con cada elemento de searchArray. Para garantizar esta capacidad, se restringe el parámetro de tipo T para implementar la interfaz IComparable<T>. El código utiliza el método CompareTo, en lugar del operador =, puesto que no existen garantías de que el tipo de argumento proporcionado para T admita el operador =.

Puede probar el procedimiento findElement con el código siguiente.

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

Las llamadas anteriores a MsgBox muestran respectivamente "0", "1" y "-1."

Vea también

Tareas

Cómo: Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes

Cómo: Utilizar una clase genérica

Conceptos

Tipos genéricos en Visual Basic

Procedimientos en Visual Basic

Argumentos y parámetros de procedimiento

Referencia

Lista de tipos

Lista de parámetros