41 votes

Annotation de variance C # d'un paramètre de type, contrainte à être du type valeur

Il est possible en C # d’ajouter une annotation de variance au paramètre type, contraint d’être un type valeur:

 interface IFoo<in T> where T : struct
{
  void Boo(T x);
}
 

Pourquoi le compilateur autorise-t-il cela si l'annotation de la variance n'a aucun sens dans une telle situation?

36voto

Eric Lippert Points 300275

Pourquoi ce qui est permis par le compilateur depuis annotation de variance rendre totalement aucun sens dans une telle situation?

Il est permis par le compilateur car jamais je n'aurais pensé que quelqu'un pourrait essayer de faire ça quand j'ai ajouté la variance des règles à la C# 4.0 compilateur.

Les avertissements du compilateur et les erreurs sont caractéristiques, et pour qu'une fonction soit mis en œuvre, il doit, au minimum, être pensé à un certain point avant de vous expédier votre compilateur. Je n'ai pas réussi à le faire, et n'ont donc jamais eu l'occasion de voire le débat de savoir s'il devrait y avoir un avertissement pour une telle situation.

Maintenant que vous avez porté à mon attention, la question est: doit - il être une fonctionnalité? Si le compilateur produire un avertissement (ou d'erreur) pour ce cas?

C'est un appel de jugement. Un certain nombre de choses que nous prenons en considération sont les suivants:

  • Le code est le genre de chose que quelqu'un peut taper dans la pensée qu'il fait quelque chose de sensé? On espère pas; on espère que le développeur qui en sait assez sur le système de type pour faire une interface variante sait aussi que la variance ne fonctionne que sur les types de référence. Mais peut-être qu'il y a des développeurs qui pourraient entrer dans la pensée qu'il va travailler. Il ne semble pas au-delà de plausibilité au moins. Il n'est pas clairement artificiel.

  • Le code est clairement erroné? Oui, il l'est probablement. Il semble très peu probable que quelqu'un délibérément veut écrire une interface qui ne ressemble en variante, mais en fait ne l'est pas.

Et ainsi de suite.

Je vais devoir lui donner plus de pensée, mais à première vue, il ressemble à ça en fait peut-être un décent avertissement à ajouter pour le compilateur. Je vais en parler avec l'équipe et nous allons envisager de l'ajouter à la Roslyn version.

Merci pour l'idée!

2voto

InBetween Points 6162

Il est permis, tout simplement parce qu'il est légal de code. Il n'y a absolument rien de mal. Oui, vous ne pouvez pas utiliser contravariant de la conversion, mais je ne vois pas le problème. Rien dans le code ne sera effectivement trompeuse ou de masquer certains tordus gotcha.

Je crois simplement que le compilateur ne vérifie pas si T est une valeur de type ou d'un type de référence lors de la vérification de la variance de validité. Il va de soi que l'équipe C#, supposé que toute personne utilisant l'interface générique de la variance serait de savoir que faire avec les types de valeur est inutile et en tout cas n'a pas d'effets secondaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X