共分散とilistの制限
共分散は、基準型をベースまたはインターフェースの変数に割り当てることができるプログラミングの原則です。タイプ。ただし、これはコレクションに関して、特にIlistインターフェイスを検討するときにジレンマをもたらします。残念ながら、リストのような組み込みの.NETコレクションは、GETとセットの両方のインデクサーを実装します。これにより、完全に共変動することができなくなります。 ]
この制限にもかかわらず、インデックス付きアクセスを維持しながら共変動を達成する方法があります。 readonlycollections(.net 4.5以降)
ireadonlylist およびireadonlycollection は、.NET 4.5で導入された共変量インターフェイスです。彼らはGETインデクサーのみを持っているため、共変動シナリオに適しています。リストおよびReadOnlyCollection 両方のインターフェイスを実装します。カスタムラッパー
.NETの以前のバージョンでインデックスアクセスを備えた共変量コレクションが必要な場合は、ラッパークラスを作成できます。ラッパークラスは、Ilist
をカプセル化し、Get IndencerとIenumerable インターフェイスのみを公開します。 t>:
public static class共分散
{
public static iindexedEnumerable ascovariant (このilist 尾)
{
新しいcovariantList (tail)を返します。
}
プライベートクラスの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; }}
}
}
パブリックインターフェイスiindexededEnumerable :ienumerable
{
tこの[int index] {get; }
int count {get; }
}