[.NET] Etes vous CoVariance ou ContraVariance avec les délégués ?

Trève de jeu de mots.
Savez que .NET 2.0 ( version 2005 nom de code WhidBey ) a introduit la notion de Covariance et de ContraVariance au niveau des délégués ( delegate ).
Qui n'a pas eu besoin un jour, de Covariance et de ContraVariance dans les délégués ?
Ne répondez pas tous en même temps.
Bon, je vois qu'il y a des timides; je vais au risque de vous apprendre quelque chose que vous savez déja, vous donnez une petite explication :
CoVariance
La notion de covariance implique la valeur renvoyée par un délégué.
Remontons un peu dans le temps c'est à dire dans la version 1.x de .NET, et regardons le fonctionnnement des delegate.
Pour cela je vais prendre 2 classes :- Une classe Parente
- Une classe Fille
Mettons en place, 2 délégués, renvoyant une instance de Parente et une instance de fille.
using System;
using System.Collections.Generic;
using System.Text;
namespace Net.Gavarin
{
public delegate Parente ParenteEventHandler();
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Net.Gavarin
{
public delegate Fille EnfantEventHandler();
}
En .net 1.x il n'est pas possible d'affecter au délégué "ParenteEventHandler" une méthode renvoyant un ancetre de Parent. L'exemple suivant ne fonctionne pas :
static Parente GetParente()
{
return new Parente();
}
static Enfant GetEnfant()
{
return new Enfant();
}
static void Main(string[] args)
{
ParenteEventHandler A = new ParenteEventHandler(GetEnfant);
}
Mais en .NET 2.0 avec la notion de CoVariance c'est correct et cela fonctionne.
ContraVariance
Conclusion
J'espere avoir été suffisament simple dans mes explications.
Si j'arrive à trouver un peu de temps on en reviendra pour voir ensemble les champs d'application. On peut déja dire que cela amène une certaine flexivité dans la programmation puisqu'on a ce typage fort dans l'écriture des "delegate".