Maison > développement back-end > C++ > Pourquoi la covariance ne prend-elle pas en charge les types de valeur en C #?

Pourquoi la covariance ne prend-elle pas en charge les types de valeur en C #?

Barbara Streisand
Libérer: 2025-01-30 21:26:13
original
709 Les gens l'ont consulté

Why Doesn't Covariance Support Value Types in C#?

C # Covariance et la restriction du type de valeur

La covariance en C # permet d'attribuer un type d'interface dérivé à son type d'interface de base. Cela permet de traiter les objets du type dérivé comme des objets du type de base. Cependant, cette fonctionnalité est intentionnellement limitée pour les types de valeur.

Le rôle de la boxe et de l'identité

La raison principale de cette limitation est le processus de boxe. Lorsqu'un type de valeur est attribué à une variable d'interface, il est en boîte - converti en un type de référence sur le tas. Cela crée un objet nouvel , modifiant l'identité de la valeur d'origine. Les types de référence, résidant déjà sur le tas, ne subissent pas cette boxe changeant d'identité.

Le maintien de l'identité est crucial pour la covariance. Si la covariance était autorisée pour les types de valeur, la modification d'un objet de type dérivé dans une collection de types de base pourrait conduire à un comportement inattendu et à des incohérences d'identité.

Exemple illustratif

l'extrait de code suivant démontre le problème:

<code class="language-csharp">IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList; // Covariance (if allowed for value types)

intList.Add(10);
Console.WriteLine(((List<int>)objList)[0]); // Output: 10
intList[0] = 20;
Console.WriteLine(((List<int>)objList)[0]); // Output: 0  (Unexpected!)</code>
Copier après la connexion

Bien que l'affectation initiale fonctionne en raison de la covariance (hypothétique), modifiant intList modifie de façon inattendue la valeur en boîte dans objList, mettant en évidence le problème d'identité qui empêche le support de covariance pour les types de valeur en C #. Le second Console.WriteLine montre la sortie inattendue de 0 car le cassera int dans objList n'est pas directement lié au int dans intList après la modification. Le objList détient une référence au original boxé int qui reste inchangé.

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