In (Modificador genérico) (Visual Basic)

En 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 especificado por el parámetro genérico. Esto permite la conversión implícita de las clases que implementan interfaces variantes y de los tipos delegados.

Para obtener más información, vea Covarianza y contravarianza (C# y Visual Basic).

Reglas

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

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

La covarianza y contravarianza son compatibles con los tipos de referencia y no con los tipos de valor.

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

Behavior

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

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

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante. También se muestra cómo se puede usar la conversión implícita para las clases que implementan dicha 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

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

' 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

Referencia

Out (Modificador genérico) (Visual Basic)

Conceptos

Varianza en interfaces genéricas (C# y Visual Basic)