Compartir vía


Out (Modificador genérico) (Visual Basic)

Para los parámetros de tipo genérico, la Out palabra clave especifica que el tipo es covariante.

Observaciones

La Covarianza permite usar un tipo más derivado que el especificado por el parámetro genérico. Esto permite la conversión implícita de clases que implementan interfaces variantes y conversión implícita de tipos delegados.

Para obtener más información, vea Covarianza y Contravarianza.

Reglas

Puede usar la Out palabra clave en interfaces y delegados genéricos.

En una interfaz genérica, se puede declarar un parámetro de tipo covariante si cumple las condiciones siguientes:

  • El parámetro type solo se usa como tipo de valor devuelto de métodos de interfaz y no se usa como tipo de argumentos de método.

    Nota:

    Hay una excepción a esta regla. Si en una interfaz covariante tiene un delegado genérico contravariante como parámetro de método, puede usar el tipo covariante como parámetro de tipo genérico para este delegado. Para obtener más información sobre los delegados genéricos covariante y contravariantes, vea Varianza en delegados y Uso de varianza para delegados genéricos de func y acción.

  • El parámetro type no se usa como restricción genérica para los métodos de interfaz.

En un delegado genérico, se puede declarar un parámetro de tipo covariante si solo se usa como un tipo de valor devuelto de método y no se usa para argumentos de método.

La covarianza y la contravarianza se admiten para los tipos de referencia, pero no se admiten para los tipos de valor.

En Visual Basic, no se pueden declarar eventos en interfaces covariantes sin especificar el tipo de delegado. Además, las interfaces covariantes no pueden tener clases anidadas, enumeraciones o estructuras, pero pueden tener interfaces anidadas.

Comportamiento

Una interfaz que tiene un parámetro de tipo covariante permite a sus métodos devolver más tipos derivados que los especificados por el parámetro de tipo. Por ejemplo, dado que en .NET Framework 4, en IEnumerable<T>, el tipo T es covariante, puede asignar un objeto del IEnumerable(Of String) tipo a un objeto del IEnumerable(Of Object) tipo sin usar ningún método de conversión especial.

A un delegado covariante se le puede asignar otro delegado del mismo tipo, pero con un parámetro de tipo genérico más derivado.

Ejemplo 1

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica covariante. También muestra cómo usar la conversión implícita para las clases que implementan una interfaz 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

Ejemplo 2

En el ejemplo siguiente se muestra cómo declarar, crear instancias e invocar un delegado genérico covariante. También muestra cómo puede usar la conversión implícita para los 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 también