out (modyfikator ogólny) (odwołanie w C#)out (generic modifier) (C# Reference)

Dla parametrów typu genetycznego out — słowo kluczowe Określa, że parametr typu jest kowariantny.For generic type parameters, the out keyword specifies that the type parameter is covariant. Możesz użyć out — słowo kluczowe w interfejsach ogólnych i delegatach.You can use the out keyword in generic interfaces and delegates.

Kowariancja umożliwia użycie typu bardziej pochodnego niż określona przez parametr ogólny.Covariance enables you to use a more derived type than that specified by the generic parameter. Dzięki temu niejawnej konwersji klas, które implementują interfejsy kowariantne i niejawnej konwersji typów obiektów delegowanych.This allows for implicit conversion of classes that implement covariant interfaces and implicit conversion of delegate types. Kowariancja i kontrawariancja są obsługiwane dla typów odwołań, ale nie są obsługiwane dla typów wartości.Covariance and contravariance are supported for reference types, but they are not supported for value types.

Interfejs, który ma kowariantnego parametru typu umożliwia jego metod zwrócić więcej typów pochodnych niż określony przez parametr typu.An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter. Na przykład ponieważ w programie .NET Framework 4 w IEnumerable<T>typu T jest kowariantny, można przypisać obiektu IEnumerable(Of String) typ obiektu IEnumerable(Of Object) typu bez przy użyciu dowolnej metody konwersji specjalne.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.

Kowariantne delegata można przypisać inną delegata tego samego typu, ale także z bardziej pochodnego parametr typu ogólnego.A covariant delegate can be assigned another delegate of the same type, but with a more derived generic type parameter.

Aby uzyskać więcej informacji, zobacz kowariancji i kontrawariancji.For more information, see Covariance and Contravariance.

Przykład — kowariantne interfejs ogólnyExample - covariant generic interface

Poniższy przykład pokazuje, jak deklarować, rozszerzanie i implementować interfejs ogólny kowariantny.The following example shows how to declare, extend, and implement a covariant generic interface. Pokazano również, jak używać niejawna konwersja dla klas, które implementują interfejs kowariantny.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;
    }
}

W interfejsie ogólnego parametr typu mogą być deklarowane jako kowariantny, jeśli spełnia następujące warunki:In a generic interface, a type parameter can be declared covariant if it satisfies the following conditions:

  • Parametr typu jest używany tylko jako zwracany typ metody interfejsu i nie jest używany jako typ argumentów metody.The type parameter is used only as a return type of interface methods and not used as a type of method arguments.

    Uwaga

    Istnieje jeden wyjątek od tej reguły.There is one exception to this rule. Jeśli w interfejsie kowariantne Delegat ogólny kontrawariantny, jako parametru metody, można użyć kowariantnego typu co parametr typu ogólnego, dla tego delegata.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. Aby uzyskać więcej informacji na temat kowariantne i kontrawariantne delegatów ogólnych, zobacz wariancje w Delegatach i przy użyciu wariancji dla akcji delegatów ogólnych Func i.For more information about covariant and contravariant generic delegates, see Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • Parametr typu nie jest używany jako ograniczenia typu ogólnego dla metod interfejsu.The type parameter is not used as a generic constraint for the interface methods.

Przykład — kowariantne Delegat ogólnyExample - covariant generic delegate

Poniższy przykład pokazuje, jak deklarować, Utwórz wystąpienie i wywołania kowariantne Delegat ogólny.The following example shows how to declare, instantiate, and invoke a covariant generic delegate. Pokazano również, jak można niejawnie przekonwertować typy delegatów.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(); 
}

Delegat ogólny typ może być zadeklarowana kowariantne Jeśli jest używany tylko jako typ zwracany metody i nie są używane dla argumentów metody.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.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also