Freigeben über


out (generischer Modifizierer) (C#-Referenz)

Für generische Typparameter gibt das out-Schlüsselwort an, dass der Typparameter kovariant ist. Sie können das out-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.

Kovarianz ermöglicht es, einen stärker abgeleiteten Typ zu verwenden als durch den generischen Parameter angegeben. Dies ermöglicht die implizite Konvertierung von Klassen, die abweichende Schnittstellen implementieren, und die implizite Konvertierung von Delegattypen. Kovarianz und Kontravarianz werden für Verweistypen, aber nicht für Werttypen unterstützt.

Eine Schnittstelle, die über einen kovarianten Typparameter verfügt, ermöglicht es den zugehörigen Methoden, mehr abgeleitete Typen zurückzugeben als vom Typparameter angegeben. Da in .NET Framework 4 beispielsweise Typ T in IEnumerable<T> kovariant ist, können Sie einem Objekt des Typs IEnumerable(Of Object) ein Objekt des Typs IEnumerabe(Of String) zuweisen, ohne besondere Konvertierungsmethoden zu verwenden.

Einem kovarianten Delegaten kann ein anderer Delegat desselben Typs zugewiesen werden, allerdings mit einem stärker abgeleiteten generischen Typparameter.

Weitere Informationen finden Sie unter Kovarianz und Kontravarianz (C# und Visual Basic).

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie eine kovariante generische Schnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie die implizite Konvertierung für Klassen verwendet wird, die eine kovariante Schnittstelle implementieren.

// 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 kovariant deklariert werden, wenn er die folgenden Bedingungen erfüllt:

  • Der Typparameter wird nur als Rückgabetyp von Schnittstellenmethoden und nicht als Typ von Methodenargumenten verwendet.

    Tipp

    Es gibt allerdings eine Ausnahme zu dieser Regel. Wenn eine kovariante Schnittstelle einen kontravarianten generischen Delegaten als Methodenparameter enthält, können Sie den kovarianten Typ als generischen Typparameter für diesen Delegaten verwenden. Weitere Informationen über kovariante und kontravariante generische Delegaten finden Sie unter Varianz in Delegaten (C# und Visual Basic) und Verwenden von Varianz für die generischen Delegaten Func und Action (C# und Visual Basic).

  • Der Typparameter wird nicht als generische Einschränkung für die Schnittstellenmethoden verwendet.

Im folgenden Beispiel wird veranschaulicht, wie ein kovarianter generischer Delegat deklariert, instanziiert und aufgerufen wird. Außerdem wird gezeigt, wie Delegattypen implizit konvertiert werden.

// 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 kovariant deklariert werden, wenn er nur als Methodenrückgabetyp und nicht für Methodenargumente verwendet wird.

C#-Programmiersprachenspezifikation

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

Siehe auch

Referenz

in (generischer Modifizierer) (C#-Referenz)

Modifizierer (C#-Referenz)

Konzepte

Varianz in generischen Schnittstellen (C# und Visual Basic)