Comparteix via


out (modificador genérico) (Referencia de C#)

Para los parámetros de tipo genérico, la out palabra clave especifica que el parámetro de tipo es covariante. Use la out palabra clave en interfaces y delegados genéricos.

La Covarianza permite usar un tipo más derivado que el parámetro genérico especificado. Esta característica permite la conversión implícita de clases que implementan interfaces covariantes y conversión implícita de tipos delegados. La covarianza y la contravarianza admiten tipos de referencia, pero no admiten tipos de valor.

Una interfaz con 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, en IEnumerable<T>, el tipo T es covariante, puede asignar un objeto del IEnumerable<string> tipo a un objeto del IEnumerable<object> tipo sin usar ningún método de conversión especial.

Puede asignar un delegado covariante a otro delegado del mismo tipo, pero con un parámetro de tipo genérico más derivado.

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

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

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<out R> { }

// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }

// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }

class Program
{
    static void Test()
    {
        ICovariant<Object> iobj = new Sample<Object>();
        ICovariant<String> istr = new Sample<String>();

        // You can assign istr to iobj because
        // the ICovariant interface is covariant.
        iobj = istr;
    }
}

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

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

    Nota:

    Hay una excepción a esta regla. Si 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.

  • No se usa el parámetro de tipo como restricción genérica para los métodos de interfaz.

En el ejemplo siguiente se muestra cómo declarar, crear instancias e invocar un delegado genérico covariante. También muestra cómo convertir implícitamente los tipos de delegado.

// Covariant delegate.
public delegate R DCovariant<out R>();

// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }

public static Button SampleButton()
{ return new Button(); }

public void Test()
{
    // Instantiate the delegates with the methods.
    DCovariant<Control> dControl = SampleControl;
    DCovariant<Button> dButton = SampleButton;

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

    // Invoke the delegate.
    dControl();
}

En un delegado genérico, declare un tipo covariante si lo usa solo como un tipo de valor devuelto de método y no para argumentos de método.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Consulte también