Freigeben über


in (Allgemeiner Modifizierer) (C#-Referenz)

Verwenden Sie für generische Typparameter das in Schlüsselwort, um kontravariante Typargumente zuzulassen. Verwenden Sie das in Schlüsselwort in generischen Schnittstellen und Delegaten.

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.

Contravariance ermöglicht es Ihnen, einen weniger abgeleiteten Typ als den durch den generischen Parameter angegebenen Typ zu verwenden. Dieses Feature ermöglicht die implizite Konvertierung von Klassen, die kontravariante Schnittstellen und implizite Konvertierung von Delegattypen implementieren. Referenztypen unterstützen Kovarianz und Kontravarianz in generischen Typparametern, aber Wertetypen unterstützen diese Features nicht.

Sie können einen Typ nur dann als kontravariant in einer generischen Schnittstelle oder Stellvertretung deklarieren, wenn er den Typ der Parameter einer Methode und nicht den Rückgabetyp der 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 z. B. der Typ T kontravariant. Sie können einem Objekt des Typs ein Objekt des IComparer<Person>IComparer<Employee> Typs zuweisen, ohne spezielle Konvertierungsmethoden zu verwenden, wenn Employee er erbt Person.

Sie können einem anderen Delegaten desselben Typs einen Kontravariantendelegat zuweisen, 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.

Siehe auch