Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Bei generischen Typparametern gibt das out Schlüsselwort an, dass der Typparameter kovariant ist. Verwenden Sie das out Schlüsselwort in generischen Schnittstellen und Delegaten.
Mit der Kovarianz können Sie einen abgeleiteten Typ verwenden, als der generische Parameter angibt. Dieses Feature ermöglicht die implizite Konvertierung von Klassen, die kovariante Schnittstellen und die implizite Konvertierung von Delegatentypen implementieren. Kovarianz und Kontravarianz unterstützen Referenztypen, unterstützen jedoch keine Werttypen.
Eine Schnittstelle mit einem kovarianten Typparameter ermöglicht es seinen Methoden, mehr abgeleitete Typen als vom Typparameter angegebene zurückzugeben. Da z. B. in .NET, typ IEnumerable<T>T kovariant ist, können Sie einem Objekt des Typs ein Objekt IEnumerable<string> des IEnumerable<object> Typs zuweisen, ohne spezielle Konvertierungsmethoden zu verwenden.
Sie können einem anderen Delegaten desselben Typs eine kovariante Stellvertretung zuweisen, jedoch mit einem abgeleiteten generischen Typparameter.
Weitere Informationen finden Sie unter "Kovarianz" und "Contravariance".
Die C#-Sprachreferenz dokumentiert die zuletzt veröffentlichte Version der C#-Sprache. Außerdem enthält sie eine erste Dokumentation zu Funktionen in der öffentlichen Vorschau für die kommende Sprachversion.
In der Dokumentation werden alle Features identifiziert, die in den letzten drei Versionen der Sprache oder in der aktuellen öffentlichen Vorschau eingeführt wurden.
Tipp
Informationen dazu, wann ein Feature erstmals in C# eingeführt wurde, finden Sie im Artikel zum Versionsverlauf der C#-Sprache.
Das folgende Beispiel zeigt, wie eine kovariante generische Schnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie 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;
}
}
Deklarieren Sie in einer generischen Schnittstelle einen Typparameterkovariant, wenn er die folgenden Bedingungen erfüllt:
Sie verwenden den Typparameter nur als Rückgabetyp von Schnittstellenmethoden und verwenden ihn nicht als Typ von Methodenargumenten.
Hinweis
Es gibt eine Ausnahme für diese Regel. Wenn eine kovariante Schnittstelle über einen kontravarianten generischen Delegat als Methodenparameter verfügt, können Sie den kovarianten Typ als generischen Typparameter für diesen Delegaten verwenden. Weitere Informationen zu kovarianten und kontravarianten generischen Delegaten finden Sie unter Varianz in Delegaten und Using Variance for Func and Action Generic Delegates.
Sie verwenden den Typparameter nicht als generische Einschränkung für die Schnittstellenmethoden.
Das folgende Beispiel zeigt, wie Sie einen generischen Kovariantendelegat deklarieren, instanziieren und aufrufen. Außerdem wird gezeigt, wie Stellvertretungstypen 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();
}
Deklarieren Sie in einem generischen Delegat einen Typkovariant, wenn Sie ihn nur als Methodenrückgabetyp und nicht für Methodenargumente verwenden.
C#-Sprachspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.