Compartilhar via


Out (Modificador Genérico) (Visual Basic)

Para parâmetros de tipo genérico, a Out palavra-chave especifica que o tipo é covariante.

Observações

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

Para obter mais informações, consulte Covariance e Contravariance.

Regras

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

Em uma interface genérica, um parâmetro de tipo poderá ser declarado covariante se atender às seguintes condições:

  • O parâmetro de tipo é usado apenas como um tipo de retorno de métodos de interface e não usado como um tipo de argumentos de método.

    Observação

    Há uma exceção a essa regra. Se em uma interface covariante você tiver um delegado genérico contravariante como um parâmetro de método, poderá usar o tipo covariante como um parâmetro de tipo genérico para esse delegado. Para obter mais informações sobre delegados genéricos covariantes e contravariantes, consulte Variação em Delegados e Uso de Variação para Representantes Genéricos de Func e Ação.

  • O parâmetro de tipo não é usado como uma restrição genérica para os métodos de interface.

Em um delegado genérico, um parâmetro de tipo poderá ser declarado covariante se ele for usado apenas como um tipo de retorno de método e não usado para argumentos de método.

Há suporte para covariância e contravariância para tipos de referência, mas eles não têm suporte para tipos de valor.

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

Comportamento

Uma interface que tem um parâmetro de tipo covariante permite que seus métodos retornem tipos mais derivados do que os especificados pelo parâmetro de tipo. Por exemplo, como no .NET Framework 4, no IEnumerable<T>tipo T é covariante, você pode atribuir um objeto do IEnumerable(Of String) tipo a um objeto do IEnumerable(Of Object) tipo sem usar nenhum método de conversão especial.

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

Exemplo 1

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

' Covariant interface.
Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.
Interface IExtCovariant(Of Out R)
    Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.
Class Sample(Of R)
    Implements ICovariant(Of R)
End Class

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

    ' You can assign istr to iobj because
    ' the ICovariant interface is covariant.
    iobj = istr
End Sub

Exemplo 2

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico covariante. Ele também mostra como você pode usar a conversão implícita para tipos delegados.

' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
    Return New Control()
End Function

Public Shared Function SampleButton() As Button
    Return New Button()
End Function

Private Sub Test()

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

    ' You can assign dButton to dControl
    ' because the DCovariant delegate is covariant.
    dControl = dButton

    ' Invoke the delegate.
    dControl()
End Sub

Consulte também