out (generischer Modifizierer) (C#-Referenz)out (Generic Modifier) (C# Reference)

Das Schlüsselwort out gibt für generische Typparameter an, dass der Typparameter kovariant ist.For generic type parameters, the out keyword specifies that the type parameter is covariant. Sie können das out-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.You can use the out keyword in generic interfaces and delegates.

Kovarianz ermöglicht Ihnen die Verwendung eines stärker abgeleiteten Typs als durch den generischen Parameter angegeben.Covariance enables you to use a more derived type than that specified by the generic parameter. Dadurch wird eine implizite Konvertierung von Klassen berücksichtigt, die variante Schnittstellen und Konvertierung von Delegattypen implementiert.This allows for implicit conversion of classes that implement variant interfaces and implicit conversion of delegate types. Kovarianz und Kontravarianz werden für Verweistypen unterstützt, aber nicht für Werttypen.Covariance and contravariance are supported for reference types, but they are not supported for value types.

Die Methoden einer Schnittstelle, die einen kovarianten Typparameter hat, können mehr abgeleitete Typen als durch den Typparameter angegeben zurückgeben.An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter. Da z.B. in .NET Framework 4 Typ T in IEnumerable<T> kovariant ist, können Sie ein Objekt des IEnumerable(Of String)-Typs an ein Objekt des IEnumerable(Of Object)-Typs zuweisen, ohne besondere Konvertierungsmethoden zu verwenden.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.

Ein kovarianter Delegat kann einem anderen Delegaten desselben Typs zugewiesen werden, jedoch mit einem stärker abgeleiteten generischen Typparameter.A covariant delegate can be assigned another delegate of the same type, but with a more derived generic type parameter.

Weitere Informationen finden Sie unter Kovarianz und Kontravarianz.For more information, see Covariance and Contravariance.

BeispielExample

Im folgenden Beispiel wird gezeigt, wie Sie eine kovariante generische Schnittstelle deklarieren, erweitern und implementieren.The following example shows how to declare, extend, and implement a covariant generic interface. Es wird auch gezeigt, wie eine implizite Konvertierung für Klassen verwendet wird, die eine kovariante Schnittstelle implementieren.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;
    }
}

In einer generischen Schnittstelle kann ein Typparameter als kovariant deklariert werden, wenn er die folgenden Bedingungen erfüllt:In a generic interface, a type parameter can be declared covariant if it satisfies the following conditions:

  • Der Typparameter wird nur als Rückgabetyp von Schnittstellenmethoden, und nicht als Typ von Methodenargumenten verwendet.The type parameter is used only as a return type of interface methods and not used as a type of method arguments.

    Hinweis

    Es gibt allerdings eine Ausnahme zu dieser Regel.There is one exception to this rule. Wenn Sie in einer kovarianten Schnittstelle einen kontravarianten generischen Delegaten als Methodenparameter angegeben haben, können Sie den Typ als einen generischen Typparameter für diesen Delegaten verwenden.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. Weitere Informationen über kovariante und kontravariante generische Delegate finden Sie unter Varianz in Delegaten und Verwenden von Varianz für die generischen Delegaten Func und Action.For more information about covariant and contravariant generic delegates, see Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • Der Typparameter wird nicht als generische Einschränkung für die Schnittstellenmethoden verwendet.The type parameter is not used as a generic constraint for the interface methods.

BeispielExample

Das folgende Beispiel zeigt, wie Sie einen kovarianten generischen Delegaten deklarieren, instanziieren und aufrufen.The following example shows how to declare, instantiate, and invoke a covariant generic delegate. Es wird gezeigt, wie Sie Delegattypen implizit konvertieren.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(); 
}

In einem generischen Delegaten kann ein Typ als kovariant deklariert werden, wenn er nur als Methodenrückgabetyp und nicht für Methodenargumente verwendet wird.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.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

Varianz in generischen SchnittstellenVariance in Generic Interfaces
inin
ModifiziererModifiers