Compartilhar via


check-out (genérico Modificador) (C# referência)

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 interfaces genéricas e delegados.

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 a 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 os tipos de valor.

Uma interface que tem um parâmetro de tipo covariant permite que os seus métodos retornar mais tipos derivados que o especificado pelo parâmetro de tipo. Por exemplo, porque no.NET Framework 4, no IEnumerable<T>, é do 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.

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

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico covariant. Ele também mostra como converter implicitamente os 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(); 
}

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 C# Language Specification A especificação de linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

em (genérico Modificador) (C# referência)

Modifiers (C# Reference)

Conceitos

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