Pourquoi n’y a-t-il pas de variance générique pour les classes dans C # 4.0?

Si nous l’avons pour les interfaces, pourquoi ne l’avons-nous pas aussi pour les cours? Quel serait le problème que nous pourrions rencontrer en l’utilisant?

Supposons que vous ayez une classe C qui était covariante dans T. Quelle pourrait être sa mise en œuvre? T doit être sorti seulement. Cela signifie que C ne peut avoir aucune méthode qui prend un T, une propriété de type T avec un setter, ou un champ de type T , car les champs sont logiquement les mêmes que ceux des propriétés; T entre

A peu près la seule chose utile que vous puissiez construire avec une classe covariante est quelque chose d’immuable en ce qui concerne T. Maintenant, je pense que ce serait génial d’avoir des listes immuables et covariantes et des stacks de types. Mais cette caractéristique n’est pas si évidente qu’elle justifierait clairement la dépense massive pour que le système de caractères prenne en charge de manière native les types de classes immuables et covariants.

Un commentaire ci-dessus demandait un exemple où cela serait utile. Considérez l’esquisse suivante:

 sealed class Stack { private readonly T head; private readonly Stack tail; public T Peek() { return head; } public Stack Pop() { return tail; } public Stack(T head, Stack tail) { this.tail = tail; this.head = head; } } static class StackExtensions { public static Stack Push(this Stack tail, T head) { return new Stack(head, tail); } public static bool IsEmpty(this Stack stack) { return stack == null; } } 

Supposons que vous ayez des classes covariantes. Maintenant vous pouvez dire

 Stack ssortingngs = null; ssortingngs = ssortingngs.Push("hello"); ssortingngs = ssortingngs.Push("goodbye"); Stack objects = ssortingngs; objects = objects.Push(123); 

Et hé, nous avons juste poussé un nombre entier sur une stack de chaînes, mais tout s’est bien passé! Il n’y a aucune raison pour que cela ne puisse pas être type. Une opération qui violerait la sécurité de type sur une structure de données mutable peut être covariante en toute sécurité sur une structure de données immuable.

Découvrez ce post msdn: Variance dans les types génériques (Guide de programmation C #)

L’équipe .NET ainsi que l’équipe C # et VB.NET ont des ressources limitées, le travail qu’ils ont effectué sur la co-et la contravariance permet de résoudre la plupart des problèmes du monde réel . Les systèmes de types sont très complexes pour être corrects – une solution qui fonctionne dans 99,9999% des cas n’est pas suffisante si elle conduit à un code dangereux dans les autres cas.

Je ne pense pas que le coût / temps de prise en charge des spécifications de co- et de contravariance (par exemple «in» / «out») sur les méthodes de classe soit d’une valeur suffisamment grande. Je peux voir très peu de cas où ils seraient utilisables – en raison du manque d’inheritance de classes multiples.

Préféreriez-vous avoir attendu encore 6 mois pour .net afin d’obtenir ce support?


Une autre façon de penser à cela est que dans .net

  • Interfaces / delegates – servent à modéliser le système de type conceptuel d’une application
  • La classe est utilisée pour implémenter les types ci-dessus
  • L’inheritance de classe est utilisé pour réduire la duplication de code tout en effectuant les opérations ci-dessus.
  • co-et contravariance concerne le système de type conceptuel d’une application