Partilhar via


Em (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 permite que você use 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 conversão implícita de tipos delegate.

Para obter mais informações, consulte Covariância e/contravariância (C# e Visual Basic).

Regras

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

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

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

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

Comportamento

Uma interface que possui um parâmetro de tipo contravariant permite que os seus métodos aceitar os argumentos de menos tipos derivados além daqueles especificados pelo parâmetro de tipo de interface.Por exemplo, porque no.NET Framework 4, no IComparer<T> interface, tipo t contravariant, você pode atribuir um objeto da IComparer(Of Person) a um objeto do tipo da IComparer(Of Employee) tipo 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 para 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

Check-out (modificador genérico) (Visual Basic)

Conceitos

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