Maison > développement back-end > C++ > Pourquoi les classes covariantes ne sont-elles pas prises en charge dans C# 4.0 ?

Pourquoi les classes covariantes ne sont-elles pas prises en charge dans C# 4.0 ?

Linda Hamilton
Libérer: 2025-01-12 21:52:43
original
894 Les gens l'ont consulté

Why Aren't Covariant Classes Supported in C# 4.0?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal