Covariância e Contravariance em representantes (guia de programação C#)

Covariância and contravariance proporcionam um grau de flexibilidade quando você assinaturas de método com delegado tipos.Covariância permite um método para ter um tipo de retorno mais derivado de que está definido no delegado.Contravariance permite um método com tipos de parâmetro que são menos derivado no tipo delegado.

Exemplo 1 (covariância)

Descrição

Este exemplo demonstra como delegados podem ser usados com métodos que têm tipos de retorno são obtidos com o tipo de retorno na assinatura do delegado.O tipo de dados retornado por SecondHandler é do tipo Dogs, que deriva de Mammals tipo é definido no delegado.

Código

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

Exemplo 2 (Contravariance)

Descrição

Este exemplo demonstra como delegados podem ser usados com os métodos com parâmetros de tipo são tipos base do tipo de parâmetro de assinatura do delegado.Com contravariance, agora você pode usar um manipulador de eventos em locais onde, anteriormente, você precisaria usar manipuladores separados.Por exemplo, você agora pode criar um manipulador de eventos que aceita um parâmetro de entrada EventArgs e usá-lo com o evento botão.MouseClick que envia um tipo de MouseEventArgs sistema autônomo um parâmetro e também com o evento TextBox.KeyDown envia um parâmetro KeyEventArgs.

Código

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

Consulte também

Conceitos

Guia de Programação C#

Referência

Eventos (Guia de programação do C#)

Representantes (guia de programação C#)

Representantes genéricos (Guia de programação C#)