C # Types génériques de valeur moyenne de type insatisfaisant
La variance des génériques permet au type de hériter de la collaboration ou de l'inversion de ses paramètres. Cependant, ces mécanismes ne sont pas applicables aux types de valeur. Pour comprendre cette limite, nous devons étudier le concept d'emballage et son impact sur la sécurité des types.
La déclaration est un changement. La coordination permet aux types dérivés de remplacer le type de base, tel que
et. Cependant, le type de valeur n'est pas le cas. Considérez le code suivant:
IEnumerable<T>
IEnumerable<string>
Ce code peut entraîner des erreurs de compilation car le type de valeur est considéré comme immuable. La variance ne convient que pour le type de référence. La raison en est la complexité de la boîte. IEnumerable<object>
<code class="language-csharp">IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList;</code>
est créé autour de
. Cela permet à des types de valeur d'être considérés comme un type de référence dans certains cas.
int
Cependant, en termes de collaboration et d'inverse, la boxe apportera de graves types de problèmes de sécurité. Si le type de valeur est autorisé, le type dérivé peut inclure différentes données de son type de base. Cela peut entraîner un comportement accidentel et des dommages potentiels des données. object
int
Par exemple, peut inclure des objets avec différents formulaires indiquant des formulaires. Lorsque ces objets sont visités, ils doivent être déchargés à la valeur d'origine object
lors de l'exécution. Si le formulaire est incohérent, l'annulation de la boîte peut entraîner l'erreur de type de valeur ou les dommages aux données.
Afin de maintenir la sécurité du type, la CLR limite la variance au type de référence. Cela peut garantir que le formulaire est cohérent et que la conversion entre différents types ne provoquera pas l'intégrité des données.
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!