Partilhar via


In (Modificador genérico) (Visual Basic)

Para parâmetros de tipo genéricos, a In palavra-chave especifica que o parâmetro type é contravariante.

Observações

A contravariância permite que você use um tipo menos derivado do que o especificado pelo parâmetro genérico. Isso permite a conversão implícita de classes que implementam interfaces variantes e a conversão implícita de tipos delegados.

Para obter mais informações, consulte Covariância e contravariância.

Regras

Você pode usar a In palavra-chave em interfaces genéricas e delegados.

Um parâmetro type pode ser declarado contravariante em uma interface genérica ou delegar se for usado apenas como um tipo de argumentos de método e não usado como um tipo de retorno de método. ByRef Os parâmetros não podem ser covariantes ou contravariantes.

Covariância e contravariância são suportadas para tipos de referência e não são suportadas para tipos de valor.

No Visual Basic, você não pode declarar eventos em interfaces contravariantes sem especificar o tipo de delegado. Além disso, as interfaces contravariantes não podem ter classes, enums ou estruturas aninhadas, mas podem ter interfaces aninhadas.

Comportamento

Uma interface que tem um parâmetro de tipo contravariante permite que seus métodos aceitem argumentos de tipos menos derivados do que aqueles especificados pelo parâmetro de tipo de interface. Por exemplo, como no .NET Framework 4, na interface, o IComparer<T> tipo T é contravariante, você pode atribuir um objeto do IComparer(Of Person) tipo a um objeto do tipo sem usar nenhum método de IComparer(Of Employee) conversão especial se Employee herdar de Person.

Um delegado contravariante pode ser atribuído a outro delegado do mesmo tipo, mas com um parâmetro de tipo genérico menos derivado.

Exemplo - interface genérica contravariante

O exemplo a seguir mostra como declarar, estender e implementar uma interface genérica contravariante. Ele também mostra como você pode usar a conversão implícita para classes que implementam essa interface.

' 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

Exemplo - delegado genérico contravariante

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico contravariante. Ele também mostra como você pode converter implicitamente um 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

Consulte também