共分散と 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 中国語 Web サイトの他の関連記事を参照してください。