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 in Schlüsselwort an, dass der Typparameter kontravariant ist. Sie können das in Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.
Contravariance ermöglicht ihnen die Verwendung eines weniger abgeleiteten Typs als der durch den generischen Parameter angegebene. Dies ermöglicht die implizite Konvertierung von Klassen, die kontravariante Schnittstellen und implizite Konvertierung von Delegattypen implementieren. Kovarianz und Kontravarianz in generischen Typparametern werden für Referenztypen unterstützt, werden jedoch für Werttypen nicht unterstützt.
Ein Typ kann in einer generischen Schnittstelle oder einem Delegaten nur als Kontravariant deklariert werden, wenn er den Typ der Parameter einer Methode und nicht des Rückgabetyps einer Methode definiert.
In, refund out Parameter müssen invariant sein, d. h. sie sind weder kovariant noch kontravariant.
Eine Schnittstelle mit einem Kontravariantentypparameter ermöglicht es seinen Methoden, Argumente von weniger abgeleiteten Typen als vom Schnittstellentypparameter angegebenen zu akzeptieren. In der IComparer<T> Schnittstelle ist der Typ T beispielsweise kontravariant, Sie können einem Objekt des Typs ein Objekt IComparer<Person> des IComparer<Employee> Typs zuweisen, ohne spezielle Konvertierungsmethoden zu verwenden, wenn Employee er erbt Person.
Einem Kontravariantendelegat kann ein anderer Delegat desselben Typs zugewiesen werden, jedoch mit einem weniger abgeleiteten generischen Typparameter.
Weitere Informationen finden Sie unter "Kovarianz" und "Contravariance".
Contravariant generic interface
Im folgenden Beispiel wird gezeigt, wie eine generische Kontravarianzschnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie Sie die implizite Konvertierung für Klassen verwenden können, die diese Schnittstelle implementieren.
// Contravariant interface.
interface IContravariant<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
class Program
{
static void Test()
{
IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
}
}
Contravariant generic delegate
Das folgende Beispiel zeigt, wie ein generischer Stellvertretung deklarieren, instanziieren und aufrufen. Außerdem wird gezeigt, wie Sie einen Delegattyp implizit konvertieren können.
// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }
public void Test()
{
// Instantiating the delegates with the methods.
DContravariant<Control> dControl = SampleControl;
DContravariant<Button> dButton = SampleButton;
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
// Invoke the delegate.
dButton(new Button());
}
C#-Sprachspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.