In (Modificador genérico) (Visual Basic)

Para los parámetros de tipo genérico, la palabra clave In especifica que el parámetro de tipo es contravariante.

Comentarios

La contravarianza permite usar un tipo menos derivado que el que se especifica en el parámetro genérico. Esto permite la conversión implícita de las clases que implementan interfaces variantes y la conversión implícita de los tipos de delegado.

Para obtener más información, vea Covarianza y contravarianza.

Reglas

Puede usar la palabra clave In en las interfaces y delegados genéricos.

Un parámetro de tipo se puede declarar como contravariante en una interfaz o delegado genéricos si solo se usa como un tipo de argumentos de método y no se usa como un tipo de valor devuelto de método. ByRef Los parámetros no pueden ser covariantes ni contravariantes.

La covarianza y la contravariancia se admiten para los tipos de referencia y no se admiten para los tipos de valor.

En Visual Basic, no se pueden declarar eventos en interfaces contravariantes sin especificar el tipo de delegado. Además, las interfaces contravariantes no pueden tener clases anidadas, enumeraciones o estructuras, pero pueden tener interfaces anidadas.

Comportamiento

Una interfaz que tiene un parámetro de tipo contravariante permite que sus métodos acepten argumentos de tipos menos derivados que los que se especifican en el parámetro de tipo de interfaz. Por ejemplo, como en .NET Framework 4, en la interfaz, el tipo T es contravariante, puede asignar un objeto del tipo a un objeto del tipo sin usar ningún método de conversión especial si hereda de IComparer<T> IComparer(Of Person) IComparer(Of Employee) Employee Person .

A un delegado contravariante se le puede asignar otro delegado del mismo tipo, pero con un parámetro de tipo genérico menos derivado.

Ejemplo: interfaz genérica contravariante

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante. También se muestra cómo puede usar la conversión implícita para las clases que implementan esta interfaz.

' Contravariant interface.
Interface IContravariant(Of In A)
End Interface

' Extending contravariant interface.
Interface IExtContravariant(Of In A)
    Inherits IContravariant(Of A)
End Interface

' Implementing contravariant interface.
Class Sample(Of A)
    Implements IContravariant(Of A)
End Class

Sub Main()
    Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
    Dim istr As IContravariant(Of String) = New Sample(Of String)()

    ' You can assign iobj to istr, because
    ' the IContravariant interface is contravariant.
    istr = iobj
End Sub

Ejemplo: delegado genérico contravariante

En el ejemplo siguiente se muestra cómo declarar e invocar un delegado genérico contravariante, y crear instancias de este. También se muestra cómo puede convertir implícitamente un tipo de delegado.

' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)

' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub

Public Shared Sub SampleButton(ByVal control As Button)
End Sub

Private Sub Test()

    ' Instantiating the delegates with the methods.
    Dim dControl As DContravariant(Of Control) =
        AddressOf SampleControl
    Dim dButton As DContravariant(Of Button) =
        AddressOf SampleButton

    ' You can assign dControl to dButton
    ' because the DContravariant delegate is contravariant.
    dButton = dControl

    ' Invoke the delegate.
    dButton(New Button())
End Sub

Vea también