Compartilhar via


In (Modificador Genérico) (Visual Basic)

Para os parâmetros de tipo genérico, o In palavra-chave especifica que o parâmetro de tipo contravariant.

Comentários

/ Contravariância lhe permite usar um tipo derivado menos do que o especificado pelo parâmetro genérico. Isso permite a conversão implícita de classes que implementam interfaces variant e a conversão implícita de tipos delegate.

For more information, see Covariância e/contravariância (C# e Visual Basic).

Rules

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

Um parâmetro de tipo pode ser declarada contravariant em um delegate ou genérico interface se ele é usado apenas como um tipo de argumentos do método e não é usado como o tipo de retorno de um método . ByRefparâmetros não podem ser covariant ou contravariant.

contravariância são suporte para tipos de referência e não há suporte para tipos de valor.

No Visual Basic, é possível declarar eventos em interfaces de contravariant sem especificar o tipo de delegado. Além disso, contravariant interfaces não podem ter aninhadas classes, enumerações ou estruturas, mas pode ter aninhados interfaces.

Behavior

Uma interface que tem um parâmetro de tipo contravariant permite que os seus métodos aceitar os argumentos de menos tipos derivados que o especificado pelo parâmetro de tipo de interface. Por exemplo, porque no.NET Framework 4, o IComparer<T> interface, tipo t contravariant, você pode atribuir um objeto da IComparer(Of Person) tipo para um objeto do IComparer(Of Employee) digitar sem usar quaisquer métodos de conversão especial se Person herda Employee.

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

Exemplo

O exemplo a seguir mostra como declarar, estender e implementar uma interface genérica de contravariant. Ele também mostra como você pode usar a conversão implícita de classes que implementam esta 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

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico do contravariant. Ele também mostra como você pode converter implicitamente um tipo delegate.

' 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

Referência

Out (modificador genérico) (Visual Basic)

Conceitos

Variação em Interfaces genéricas (C# e Visual Basic)