out
Das Schlüsselwort in generics wird verwendet, um anzuzeigen, dass der Typ T in der Schnittstelle kovarianten ist. Details siehe Covariance and contravariance.
Das klassische Beispiel ist IEnumerable<out T>
. Da IEnumerable<out T>
covariant ist, sind Sie erlaubt die folgenden Funktionen ausführen:
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
Die zweite Zeile oben würde fehlschlagen, wenn dies nicht war kovariant, obwohl logisch sollte es funktionieren, da String aus Objekt ableitet. Bevor variance in generic interfaces zu C# und VB.NET hinzugefügt wurde (in .NET 4 mit VS 2010), war dies ein Fehler bei der Kompilierung.
Nach .NET 4, IEnumerable<T>
wurde markiert kovariant, und wurde IEnumerable<out T>
. Da IEnumerable<out T>
nur die darin enthaltenen Elemente verwendet und sie niemals hinzufügt/ändert, ist es sicher, eine aufzählbare Sammlung von Strings als eine aufzählbare Sammlung von Objekten zu behandeln, was bedeutet, dass sie kovariant ist.
Dies würde mit einem Typ wie IList<T>
nicht funktionieren, da IList<T>
eine Add
Methode hat. Angenommen, dies würde erlaubt sein:
IList<string> strings = new List<string>();
IList<object> objects = strings; // NOTE: Fails at compile time
Sie könnten dann rufen:
objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object
Dies würde natürlich nicht - so IList<T>
nicht markiert covariant werden.
Es gibt auch, btw, eine Option für in
- die von Dingen wie Vergleichsschnittstellen verwendet wird.IComparer<in T>
, zum Beispiel funktioniert der umgekehrte Weg. Sie können eine konkrete IComparer<Foo>
direkt als IComparer<Bar>
verwenden, wenn Bar
eine Unterklasse von Foo
ist, weil die IComparer<in T>
Schnittstelle contravariant ist.
gutes Beispiel wäre IObservable und IObserver , definiert in System ns in mscorlib. Öffentliche Schnittstelle IObservable und öffentliche Schnittstelle IObserver . In ähnlicher Weise IEnumerator , IEnumerable –
VivekDev