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>
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!