Compartilhar via


out (modificador genérico) (Referência de C#)

Para os parâmetros de tipo genérico, o out palavra-chave especifica que o parâmetro de tipo covariant. Você pode usar o out palavra-chave em delegados e interfaces genéricas.

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. Covariância/contravariância há suporte para e para tipos de referência, mas eles não são suportados para tipos de valor.

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, 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.

Para obter mais informações, consulte Covariância e contravariância (C# e Visual Basic).

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<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;
    }
}

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.

    Dica

    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 delegações (C# e Visual Basic) e Usando variação para delegações genéricas Func e Action (C# e Visual Basic).

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

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico covariant. Ele também mostra como converter implicitamente tipos delegate.

// 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(); 
}

Em um delegado genérico, um 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.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

in (modificador genérico) (Referência de C#)

Modificadores (Referência de C#)

Conceitos

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