Compartir a través de


Covarianza y contravarianza (Visual Basic)

En Visual Basic, la covarianza y la contravarianza permiten la conversión de referencia implícita para tipos de matriz, tipos delegados y argumentos de tipo genérico. La covarianza conserva la compatibilidad de asignaciones y la contravarianza la invierte.

En el código siguiente se muestra la diferencia entre la compatibilidad de asignaciones, la covarianza y la contravarianza.

' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str

' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject

La Covarianza para matrices permite la conversión implícita de una matriz de un tipo más derivado a una matriz de un tipo menos derivado. Pero esta operación no es segura para tipos, como se muestra en el ejemplo de código siguiente.

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10

La compatibilidad de la covarianza y la contravarianza con grupos de métodos permite hacer coincidir firmas de método con tipos de delegado. Esta coincidencia le permite asignar a un delegado no solo un método que tenga una firma coincidente, sino también un método que:

  • Devuelve un tipo más derivado (covarianza) que el tipo de valor devuelto especificado por el tipo delegado.
  • Acepta parámetros que tienen menos tipos derivados (contravarianza) que los especificados por el tipo de delegado.

Para obtener más información, vea Varianza en delegados (Visual Basic) y Uso de la varianza en delegados (Visual Basic).

En el siguiente ejemplo de código se muestra el soporte de covarianza y contravarianza para los grupos de métodos.

Shared Function GetObject() As Object
    Return Nothing
End Function

Shared Sub SetObject(ByVal obj As Object)
End Sub

Shared Function GetString() As String
    Return ""
End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()
    ' Covariance. A delegate specifies a return type as object,
    ' but you can assign a method that returns a string.
    Dim del As Func(Of Object) = AddressOf GetString

    ' Contravariance. A delegate specifies a parameter type as string,
    ' but you can assign a method that takes an object.
    Dim del2 As Action(Of String) = AddressOf SetObject
End Sub

En .NET Framework 4 o posterior, Visual Basic admite covarianza y contravarianza en interfaces y delegados genéricos y permite la conversión implícita de parámetros de tipo genérico. Para obtener más información, vea Varianza en interfaces genéricas (Visual Basic) y Varianza en delegados (Visual Basic).

En el ejemplo de código siguiente se muestra la conversión de referencia implícita para interfaces genéricas.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

Una interfaz genérica o delegado se denomina variant si sus parámetros genéricos se declaran covariante o contravariante. Visual Basic le permite crear interfaces y delegados personalizados. Para obtener más información, vea Creating Variant Generic Interfaces (Visual Basic) (Crear interfaces genéricas variantes (Visual Basic)) y Variance in Delegates (Visual Basic) (Varianza en delegados (Visual Basic)).

Título Descripción
Varianza en interfaces genéricas (Visual Basic) Describe la covarianza y la contravarianza en interfaces genéricas y proporciona una lista de interfaces genéricas variantes en .NET Framework.
Creación de interfaces genéricas variantes (Visual Basic) Muestra cómo crear interfaces variantes personalizadas.
Usar varianza en interfaces para colecciones genéricas (Visual Basic) Muestra cómo la compatibilidad con covarianza y contravarianza en las interfaces IEnumerable<T> y IComparable<T> puede ayudarle a reutilizar el código.
Varianza en delegados (Visual Basic) Se describe la covarianza y contravarianza en delegados genéricos y no genéricos y se proporciona una lista de delegados genéricos variantes en .NET Framework.
Usar varianza en delegados (Visual Basic) Se muestra cómo usar la compatibilidad de covarianza y contravarianza en los delegados no genéricos para que coincidan las firmas de método con los tipos de delegado.
Usar la varianza para los delegados genéricos Func y Action (Visual Basic) Se muestra cómo la compatibilidad de covarianza y contravarianza en los delegados Func y Action puede ayudarle a volver a usar el código.