in (generischer Modifizierer) (C#-Referenz)in (Generic Modifier) (C# Reference)

Das Schlüsselwort in gibt für generische Typparameter an, dass der Typparameter kontravariant ist.For generic type parameters, the in keyword specifies that the type parameter is contravariant. Sie können das Schlüsselwort in in generischen Schnittstellen und Delegaten verwenden.You can use the in keyword in generic interfaces and delegates.

Kontravarianz ermöglicht Ihnen die Verwendung eines weniger stark abgeleiteten Typs als der durch den generischen Parameter angegebene.Contravariance enables you to use a less derived type than that specified by the generic parameter. Dadurch wird eine implizite Konvertierung von Klassen berücksichtigt, die variante Schnittstellen und Konvertierung von Delegattypen implementiert.This allows for implicit conversion of classes that implement variant interfaces and implicit conversion of delegate types. Kovarianz und Kontravarianz in generischen Typparametern werden für Verweistypen unterstützt, aber nicht für Werttypen.Covariance and contravariance in generic type parameters are supported for reference types, but they are not supported for value types.

Ein Typ kann als kontravariant in einer generischen Schnittstelle oder einem generischen Delegaten deklariert werden, wenn er nur als Typ eines Methodenarguments und nicht als Methodenrückgabetyp verwendet wird.A type can be declared contravariant in a generic interface or delegate if it is used only as a type of method arguments and not used as a method return type. Die Parameter Ref und out dürfen nicht variant sein.Ref and out parameters cannot be variant.

Mit einer Schnittstelle, die einen kontravarianten Typparameter hat, kann ihre Methode mehr abgeleitete Typen, als durch den Typparameter der Schnittstelle angegeben, akzeptieren.An interface that has a contravariant type parameter allows its methods to accept arguments of less derived types than those specified by the interface type parameter. Da z.B. in .NET Framework 4 Typ T in der Schnittstelle IComparer<T> kontravariant ist, können Sie ein Objekt des IComparer(Of Person)-Typs an ein Objekt des IComparer(Of Employee)-Typs zuweisen, ohne besondere Konvertierungsmethoden zu verwenden, wenn Employee von Person erbt.For example, because in .NET Framework 4, in the IComparer<T> interface, type T is contravariant, you can assign an object of the IComparer(Of Person) type to an object of the IComparer(Of Employee) type without using any special conversion methods if Employee inherits Person.

Ein kontravarianter Delegat kann einem anderen Delegaten desselben Typs zugewiesen werden, jedoch mit einem weniger stark abgeleiteten generischen Typparameter.A contravariant delegate can be assigned another delegate of the same type, but with a less derived generic type parameter.

Weitere Informationen finden Sie unter Kovarianz und Kontravarianz.For more information, see Covariance and Contravariance.

BeispielExample

Im folgenden Beispiel wird gezeigt, wie Sie eine kontravariante generische Schnittstelle deklarieren, erweitern und implementieren können.The following example shows how to declare, extend, and implement a contravariant generic interface. Es wird auch gezeigt, wie Sie die implizite Konvertierung für Klassen verwenden können, die eine diese Schnittstelle implementieren können.It also shows how you can use implicit conversion for classes that implement this interface.

// 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;
    }
}

BeispielExample

Das folgende Beispiel zeigt, wie Sie einen kontravarianten generischen Delegaten deklarieren, instanziieren und aufrufen.The following example shows how to declare, instantiate, and invoke a contravariant generic delegate. Es zeigt außerdem, wie Sie einen Delegattyp implizit konvertieren können.It also shows how you can implicitly convert a delegate type.

// 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#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

outout
Kovarianz und KontravarianzCovariance and Contravariance
ModifiziererModifiers