Partilhar via


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

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

Comentários

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 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 Out palavra-chave em delegados e interfaces genéricas.

Em uma interface genérica, um parâmetro de tipo pode ser declarado covariant se ele satisfaz as condições a seguir:

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

    ObservaçãoObservação

    Há uma exceção a essa regra.Se tiver um delegado genérico do contravariant como um parâmetro de método em uma interface covariant, você pode usar o tipo covariant como um parâmetro de tipo genérico para este delegado.Para obter mais informações sobre covariant e representantes de contravariant genéricos, consulte Variação em delegados (C# e Visual Basic) e Usando a variação para representantes genéricos Func e ação (C# e Visual Basic).

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

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

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

No Visual Basic, você não pode declarar eventos em interfaces covariant sem especificar o tipo delegate.Além disso, covariant 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 covariant permite que os seus métodos retornar mais tipos derivados além daqueles especificados pelo parâmetro de tipo.Por exemplo, porque no.NET Framework 4, em IEnumerable<T>, o tipo t é covariant, você pode atribuir um objeto da IEnumerabe(Of String) a um objeto do tipo da IEnumerable(Of Object) digitar sem usar quaisquer métodos de conversão especial.

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

Exemplo

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

' 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

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

' 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

Referência

Em (modificador genérico) (Visual Basic)

Conceitos

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