Omission des classes covariantes par C# 4.0 : un examen plus approfondi
C# 4.0 a introduit une variance générique pour les interfaces, permettant une utilisation flexible des paramètres de type. Cependant, cette fonctionnalité n'a pas été étendue aux classes. Cet article examine la justification de ce choix de conception.
Les obstacles à la mise en œuvre
L'introduction d'une variance covariante dans les classes (par exemple, une C<T>
classe hypothétique) présente des défis de mise en œuvre importants. La principale limitation vient du fait que T
ne peut être utilisé que comme paramètre de sortie, dans les setters ou comme champ.
Cette contrainte est une conséquence directe du manque de getters dans les champs. Contrairement aux propriétés, les champs ne fournissent pas d'accès en lecture seule. Par conséquent, une classe covariante ne peut pas posséder un état mutable, ce qui limite considérablement ses applications pratiques.
Peser les coûts et les avantages
Bien que les classes immuables covariantes (comme les listes et les piles) seraient indéniablement avantageuses, les modifications importantes du système de types C# nécessaires pour les prendre en charge n'étaient pas jugées justifiables au moment de la sortie de C# 4.0.
Illustrer la covariance dans des structures immuables
L'exemple suivant démontre la covariance dans une pile immuable :
<code class="language-csharp">sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; }</code>
Cela permet des affectations covariantes :
<code class="language-csharp">Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; // Covariant assignment objects = objects.Push(123); //This would be an error if Stack<T> was mutable</code>
L'ajout d'un entier à la pile reste de type sécurisé en raison de l'immuabilité de la pile. L'opération ne viole pas la sécurité de type.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!