Kovarianz und Kontravarianz in Delegaten (C#-Programmierhandbuch)

Aktualisiert: November 2007

Kovarianz und Kontravarianz bieten beim Abgleichen von Methodensignaturen mit Delegattypen ein gewisses Maß an Flexibilität. Kovarianz unterstützt eine Methode mit einem stärker abgeleiteten Rückgabetyp, als im Delegaten definiert wurde. Kontravarianz unterstützt eine Methode mit Parametertypen, die weniger stark abgeleitet sind als im Delegattyp.

Beispiel 1 (Kovarianz)

Beschreibung

Anhand dieses Beispiels wird veranschaulicht, wie Delegaten mit Methoden verwendet werden können, deren Rückgabetypen von dem Rückgabetyp in der Delegatsignatur abgeleitet wird. Der von SecondHandler zurückgegebene Datentyp entspricht dem Typ Dogs, der sich von dem im Delegaten definierten Mammals-Typ ableitet.

Code

class Mammals
{
}

class Dogs : Mammals
{
}

class Program
{
    // Define the delegate.
    public delegate Mammals HandlerMethod();

    public static Mammals FirstHandler()
    {
        return null;
    }

    public static Dogs SecondHandler()
    {
        return null;
    }

    static void Main()
    {
        HandlerMethod handler1 = FirstHandler;

        // Covariance allows this delegate.
        HandlerMethod handler2 = SecondHandler;
    }
}

Beispiel 2 (Kontravarianz)

Beschreibung

Anhand dieses Beispiels wird veranschaulicht, wie Delegaten mit Methoden verwendet werden können, deren Parametertyp den Basistypen des Parametertyps in der Delegatsignatur entspricht. Mithilfe von Kontravarianz können Sie nun einen Ereignishandler verwenden, wo zuvor separate Handler erforderlich waren. Beispielsweise können Sie jetzt einen Ereignishandler erstellen, der einen EventArgs-Eingabeparameter akzeptiert, und ihn mit dem Button.MouseClick-Ereignis verwenden, das einen MouseEventArgs-Parameter sendet, oder mit dem TextBox.KeyDown-Ereignis, das einen KeyEventArgs-Parameter sendet.

Code

System.DateTime lastActivity;
public Form1()
{
    InitializeComponent();

    lastActivity = new System.DateTime();
    this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
    this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs

}

// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
    lastActivity = System.DateTime.Now;
}

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Ereignisse (C#-Programmierhandbuch)

Delegaten (C#-Programmierhandbuch)

Generische Delegaten (C#-Programmierhandbuch)