Covarianza y contravarianza en los delegados (Guía de programación de C#)

Actualización: noviembre 2007

La covarianza y la contravarianza proporcionan cierta flexibilidad al confrontar las firmas de métodos con tipos de delegado. La covarianza permite que un método tenga un tipo de valor devuelto más derivado que lo que se define en el delegado. La contravarianza permite un método con tipos de parámetro que se deriven menos que en el tipo de delegado.

Ejemplo 1 (covarianza)

Descripción

Este ejemplo muestra cómo se pueden utilizar los delegados con métodos que tienen tipos de valor devueltos que se derivan del tipo de valor devuelto en la firma de delegado. El tipo de datos devuelto por SecondHandler es de tipo Dogs, que se deriva del tipo Mammals definido en el delegado.

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

Ejemplo 2 (contravarianza)

Descripción

Este ejemplo muestra cómo se pueden utilizar los delegados con métodos que tienen parámetros de un tipo que son tipos base del tipo de parámetro de la firma de delegado. Con la contravarianza, puede utilizar ahora un controlador de eventos en lugares donde anteriormente tenía que utilizar controladores distintos. Por ejemplo, ahora puede crear un controlador de eventos que acepte un parámetro de entrada EventArgs y utilizarlo con el evento Button.MouseClick que envía un tipo MouseEventArgs como parámetro, y también con el evento TextBox.KeyDown que envía un parámetro 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;
}

Vea también

Conceptos

Guía de programación de C#

Referencia

Eventos (Guía de programación de C#)

Delegados (Guía de programación de C#)

Delegados genéricos (Guía de programación de C#)