Pourquoi C # / CLR ne supporte-t-il pas la méthode qui annule la co / contre-variance?

Il y a pas mal de questions et réponses sur le piratage informatique autour de la limitation de C # ne permettant pas aux types de retour de méthode (et d’argument) d’être modifiés en types compatibles lors de remplacements, mais pourquoi cette limitation existe-t-elle, soit dans le compilateur C #, soit dans le CLR? Comme je le vois, rien ne pourrait casser si la co-contre-variance était autorisée, alors quel est le raisonnement derrière cela?

Une question similaire pourrait être posée pour l’élargissement des parameters d’access – par exemple, remplacement d’une méthode interne protégée par une méthode publique (quelque chose que Java supporte, IIRC)

Eric Lippert a déjà répondu à cette question mieux que moi.

Découvrez sa série sur Covariance et Contravariance en C #

et

Comment la covariance générique et la contre-variance C # 4.0 sont-elles implémentées?

EDIT: Eric a fait remarquer qu’il ne parlait pas de convariance de type retour, mais j’ai décidé de garder le lien dans cette réponse car il s’agit d’une série d’articles sympas et que quelqu’un pourrait trouver cela utile de consulter ce sujet.

Cette fonctionnalité a été demandée et il y a presque 5 ans, Microsoft a répondu “Merci de l’avoir enregistrée. Nous entendons beaucoup cette demande. Nous l’examinerons dans la prochaine version.”

Et maintenant, je citerai Jon Skeet car ce ne serait pas une réponse appropriée sur StackOverflow sans une réponse de Jon Skeet. Covariance et types de retour à vide

Je soupçonne fortement que la réponse réside dans la mise en œuvre du CLR plutôt que dans une raison sémantique profonde – le CLR a probablement besoin de savoir s’il y aura ou non une valeur de retour, afin de faire les choses appropriées avec la stack. Malgré tout, cela semble un peu dommage en termes d’élégance. Je ne peux pas dire que j’en ai jamais ressenti le besoin dans la vie réelle, et il serait assez facile de simuler (pour un maximum de quatre parameters) dans .NET 3.5 en écrivant simplement un convertisseur de Func à Action , Func à l’ Action etc.

Cette réponse ne parle pas de C #, mais elle m’a aidé à mieux comprendre les problèmes et peut-être que cela aidera les autres: pourquoi n’y a-t-il pas de paramètre contraire à la variance?

Les coutures introduisant une covariance de la valeur de retour ne présentent pas d’inconvénient essentiel, contrairement à Java et C ++. Cependant, il existe une réelle confusion en introduisant une contre-variance du paramètre formel. Je pense que cette réponse en C ++ https://stackoverflow.com/a/3010614/1443505 est également valable pour C #.

Dans ce cas, vous devez simplement attendre VS2010 / .Net 4.0.

Pour développer la réponse de Joel, le CLR prend en charge la variance limitée depuis longtemps, mais le compilateur C # ne les utilise pas avant la version 4.0 avec les nouveaux modificateurs “in” et “out” sur les interfaces génériques et les delegates. Les raisons sont compliquées, et je m’embarrasserais d’essayer d’expliquer, mais ce n’est pas aussi simple qu’il y paraît.

Transformer une méthode “interne protégée” en une méthode “publique”; vous pouvez le faire en masquant la méthode:

 public new void Foo(...) { base.Foo(...); } 

(tant que les arguments, etc. sont également publics) – toute utilisation?