Comprendre la covariance et les limitations ilist
La covariance est un principe de programmation où un type de référence peut être attribué à une variable d'une base ou d'une interface taper. Cependant, cela pose un dilemme en ce qui concerne les collections, en particulier lorsque nous considérons l'interface ILIST.
Ilist représente une collection avec un accès indexé, nous permettant de récupérer des éléments par leur index. Unfortunately, built-in .NET collections like List
Solutions for Covariant Collections with Indexed Access
Malgré cette limitation, il existe des moyens d'atteindre le comportement covariant tout en maintenant un accès indexé.
1. ReadonlyCollections (de .net 4.5 en arrière)
ireadonlyList
2. Wrapper personnalisé
Si vous avez besoin d'une collection covariante avec un accès indexé dans les versions antérieures de .net, vous pouvez créer une classe de wrapper. La classe wrapper résumerait un ILIST
Le code suivant démontre une classe de wrapper personnalisée nommée CovariantList
public static class Covariance { public static IIndexedEnumerableAsCovariant (this IList tail) { return new CovariantList (tail); } private class CovariantList : IIndexedEnumerable { private readonly IList tail; public CovariantList(IList tail) { this.tail = tail; } public T this[int index] { get { return tail[index]; } } public IEnumerator GetEnumerator() { return tail.GetEnumerator();} IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); } public int Count { get { return tail.Count; } } } } public interface IIndexedEnumerable : IEnumerable { T this[int index] { get; } int Count { get; } }
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3