Condividi tramite


Covariante e controvariante nei delegati (Guida per programmatori C#)

Aggiornamento: novembre 2007

La covariante e la controvariante forniscono un ampio grado di flessibilità quando si ricerca una corrispondenza tra le firme dei metodi e i tipi delegati. Attraverso la covariante un metodo può avere un tipo restituito più derivato rispetto a quanto è definito nel delegato. La controvariante consente un metodo con tipi di parametri meno derivati rispetto a quelli del tipo delegato.

Esempio 1 (covariante)

Descrizione

Nell'esempio seguente viene illustrato come utilizzare i delegati con metodi che hanno tipi restituiti derivati dal tipo restituito nella firma del delegato. Il tipo di dati restituito da SecondHandler è di tipo Dogs, che deriva dal tipo Mammals definito nel delegato.

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

Esempio 2 (controvariante)

Descrizione

Nell'esempio seguente viene illustrato come utilizzare i delegati con metodi che hanno parametri di un tipo che è tipo base del tipo di parametro della firma del delegato. Con la controvariante è ora possibile utilizzare un gestore eventi nei punti in cui, in precedenza, era necessario utilizzare gestori separati. È ora ad esempio possibile creare un gestore eventi che accetta un parametro di input EventArgs e utilizzarlo con l'evento Button.MouseClick che invia un tipo MouseEventArgs come parametro e con l'evento TextBox.KeyDown che invia un parametro 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;
}

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Eventi (Guida per programmatori C#)

Delegati (Guida per programmatori C#)

Delegati generici (Guida per programmatori C#)