out (Modificador genérico) (Referencia de C#)out (generic modifier) (C# Reference)

Para los parámetros de tipo genérico, la palabra clave out especifica que el parámetro de tipo es covariante.For generic type parameters, the out keyword specifies that the type parameter is covariant. Puede usar la palabra clave out en las interfaces y delegados genéricos.You can use the out keyword in generic interfaces and delegates.

La covarianza le permite usar un tipo más derivado que el que se especifica en el parámetro genérico.Covariance enables you to use a more derived type than that specified by the generic parameter. Esto permite la conversión implícita de las clases que implementan interfaces covariantes y la conversión implícita de los tipos de delegado.This allows for implicit conversion of classes that implement covariant interfaces and implicit conversion of delegate types. La covarianza y la contravarianza son compatibles con los tipos de referencia, pero no lo son con los tipos de valor.Covariance and contravariance are supported for reference types, but they are not supported for value types.

Una interfaz con un parámetro de tipo covariante permite que sus métodos devuelvan tipos más derivados que los especificados por el parámetro de tipo.An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter. Por ejemplo, dado que en .NET Framework 4, en IEnumerable<T>, el tipo T es covariante, puede asignar un objeto del tipo IEnumerable(Of String) a otro objeto del tipo IEnumerable(Of Object) sin usar ningún método de conversión especial.For example, because in .NET Framework 4, in IEnumerable<T>, type T is covariant, you can assign an object of the IEnumerable(Of String) type to an object of the IEnumerable(Of Object) type without using any special conversion methods.

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.A covariant delegate can be assigned another delegate of the same type, but with a more derived generic type parameter.

Para obtener más información, vea Covarianza y contravarianza.For more information, see Covariance and Contravariance.

Ejemplo: interfaz genérica covarianteExample - covariant generic interface

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica covariante.The following example shows how to declare, extend, and implement a covariant generic interface. También se muestra cómo usar la conversión implícita para las clases que implementan una interfaz covariante.It also shows how to use implicit conversion for classes that implement a covariant interface.

// 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, un parámetro de tipo se puede declarar como covariante si cumple las siguientes condiciones:In a generic interface, a type parameter can be declared covariant if it satisfies the following conditions:

  • El parámetro de tipo se usa solamente como tipo de valor devuelto de los métodos de interfaz y no como tipo de los argumentos de método.The type parameter is used only as a return type of interface methods and not used as a type of method arguments.

    Nota

    Hay una excepción para esta regla.There is one exception to this rule. 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.If in a covariant interface you have a contravariant generic delegate as a method parameter, you can use the covariant type as a generic type parameter for this delegate. Para obtener más información sobre los delegados genéricos covariantes y contravariantes, vea Varianza en delegados y Usar la varianza para los delegados genéricos Func y Action.For more information about covariant and contravariant generic delegates, see Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • El parámetro de tipo no se usa como restricción genérica para los métodos de interfaz.The type parameter is not used as a generic constraint for the interface methods.

Ejemplo: delegado genérico covarianteExample - covariant generic delegate

En el ejemplo siguiente se muestra cómo declarar, invocar y crear instancias de un delegado genérico covariante.The following example shows how to declare, instantiate, and invoke a covariant generic delegate. También se muestra cómo convertir implícitamente los tipos de delegado.It also shows how to implicitly convert delegate types.

// 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, un tipo se puede declarar como covariante si se usa solamente como tipo de valor devuelto por un método y no se usa para los argumentos de método.In a generic delegate, a type can be declared covariant if it is used only as a method return type and not used for method arguments.

Especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also