Étant donné cette interface magique:En C# 4.0, pourquoi un paramètre out dans une méthode ne peut-il pas être covariant?
public interface IHat<out TRabbit>
{
TRabbit Take();
}
Et cette hiérarchie de classe:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
Je peux maintenant compiler ceci:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
Ce qui est génial. Mais si je définir l'interface différemment:
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
J'indiquais que le chapeau peut être vide, en utilisant une valeur de retour booléen (la version précédente aurait peut-être retourné un lapin nul d'un chapeau vide). Mais je ne fais que sortir un lapin, donc je ne fais rien de différent par rapport à la version précédente.
Le compilateur C# 4.0 dans le CTP donne une erreur dans la définition de l'interface - il exige que les paramètres de la méthode 'out' soient de type invariant. Y a-t-il une raison dure et rapide pour laquelle cela n'est pas autorisé, ou est-ce quelque chose qui pourrait être traité dans une future version?
Pour info, j'ai trouvé plusieurs blogs etc disant la même chose, mais aucun des commentaires proviennent de sources MS "officielles". Je suis assez confiant que c'est correct, cependant ... la variance C# 4.0 est toujours basée sur les règles CLI. –
Cela semble assez probable! –