理解協方差和IList 限制
協方差是程式設計中的一個原則,其中引用類型可以分配給基類或介面的變數類型。然而,當涉及集合時,特別是當我們考慮 IList 介面時,這會帶來一個困境。
IList 表示具有索引存取的集合,允許我們透過索引檢索元素。不幸的是,像 List
具有索引存取的協變集合的解決方案
儘管存在此限制,但仍有一些方法可以實現協變行為,同時保持索引存取。
1. ReadOnlyCollections(從.NET 4.5 開始)
IReadOnlyList
2.自訂包裝器
如果您需要在早期版本的 .NET 中具有索引存取的協變集合,您可以建立包裝器類別。包裝類別將封裝 IList
以下程式碼示範了一個名為 CovariantList
public static class Covariance { public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail) { return new CovariantList<T>(tail); } private class CovariantList<T> : IIndexedEnumerable<T> { private readonly IList<T> tail; public CovariantList(IList<T> tail) { this.tail = tail; } public T this[int index] { get { return tail[index]; } } public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();} IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); } public int Count { get { return tail.Count; } } } } public interface IIndexedEnumerable<out T> : IEnumerable<T> { T this[int index] { get; } int Count { get; } }
以上是如何透過 .NET 集合中的索引存取實現協變行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!