C # Covariance et contre-lamence: Type de valeur Restrictions
Les fonctionnalités de covariance et de contre-contravarianceC # permettent des affectations de types flexibles. Cependant, ces capacités sont limitées lorsque vous travaillez avec des types de valeur.
IEnumerable<T>
présente une covariance, permettant l'attribution d'une référence T
à une référence d'objet. Cela ne s'étend pas aux types de valeur, comme illustré:
<code class="language-csharp">IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; // Compiles fine IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; // Compilation error</code>
Cette différence découle de la boxe. L'attribution d'un type de valeur à une variable de référence nécessite la boxe: créer un nouvel objet alloué au tas. Cela ajoute des frais généraux et introduit des problèmes d'exécution potentiels.
Avec la covariance, le runtime de langue commune (CLR) ne peut garantir la préservation de l'identité de la valeur en boîte. Par exemple, une méthode acceptant un object[]
et modifier un élément ne garantit pas que la valeur en boîte de IEnumerable<int>
reste inchangée.
Par conséquent, pour maintenir la sécurité des types et empêcher les erreurs liées à la boxe, la covariance et la contreravariance ne sont pas prises en charge pour les types de valeur en C #.
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!