in (generischer Modifizierer) (C#-Referenz)
Für generische Typparameter gibt das in-Schlüsselwort an, dass der Typparameter kontravariant ist.Sie können das in-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.
Kontravarianz ermöglicht es, einen weniger stark 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 in generischen Typparametern werden für Verweistypen, aber nicht für Werttypen unterstützt.
Ein Typ kann in einer generischen Oberfläche oder einem generischen Delegaten kovariant deklariert werden, wenn er nur als Typ von Methodenargumenten und nicht als Methodenrückgabetyp verwendet wird.Der Ref-Parameter und der out-Parameter können kein Variant sein.
Eine Schnittstelle mit einem kontravarianten Typparameter ermöglicht es, dass die zugehörigen Methoden Argumente von weniger stark abgeleiteten Typen akzeptieren können als die vom Schnittstellentypparameter angegebenen.Da in .NET Framework 4 Typ T in der IComparer<T>-Schnittstelle z. B. kontravariant ist, können Sie einem Objekt des IComparer(Of Employee)-Typs ein Objekt des IComparer(Of Person)-Typs zuweisen, ohne spezifische Konvertierungsmethoden zu verwenden, wenn EmployeePerson erbt.
Einem kontravarianten Delegaten kann ein anderer Delegat desselben Typs zugewiesen werden, allerdings mit einem weniger stark abgeleiteten generischen Typparameter.
Weitere Informationen finden Sie unter Kovarianz und Kontravarianz (C# und Visual Basic).
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie eine kontravariante generische Schnittstelle 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;
}
}
Im folgenden Beispiel wird veranschaulicht, wie ein kontravarianter generischer Delegat deklariert, instanziiert und aufgerufen wird.Darüber hinaus 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#-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
out (generischer Modifizierer) (C#-Referenz)