Share via


Covariance et contravariance dans les délégués (Guide de programmation C#)

Mise à jour : novembre 2007

La covariance et la contravariance fournissent un degré de souplesse lors de l'appariement des signatures des méthodes avec les types délégués. La covariance autorise qu'une méthode ait un type de retour plus dérivé que celui défini dans le délégué. La contravariance autorise qu'une méthode ait des types de paramètres moins dérivés que ceux du type délégué.

Exemple 1 (covariance)

Description

Cet exemple montre comment les délégués peuvent être utilisés avec les méthodes ayant des types de retour dérivés du type de retour dans la signature du délégué. Le type de données retourné par SecondHandler est du type Dogs qui dérive du type Mammals défini dans le délégué.

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

Exemple 2 (contravariance)

Description

Cet exemple montre comment les délégués peuvent être utilisés avec les méthodes ayant des paramètres d'un type qui sont les types de base du type de paramètre de la signature du délégué. Avec la contravariance, vous pouvez maintenant utiliser un gestionnaire d'événements aux emplacements où, précédemment, vous auriez dû utiliser des gestionnaires séparés. Par exemple, vous pouvez maintenant créer un gestionnaire d'événements qui accepte un paramètre d'entrée EventArgs et l'utiliser avec l'événement Button.MouseClick qui envoie un type MouseEventArgs comme paramètre, et également avec l'événement TextBox.KeyDown qui envoie un paramètre KeyEventArgs.

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

Voir aussi

Concepts

Guide de programmation C#

Référence

Événements (Guide de programmation C#)

Délégués (Guide de programmation C#)

Délégués génériques (Guide de programmation C#)