ネストされたジェネリックコレクションを使用してデザインを実装しているときに、C#の不変ジェネリックによって明らかに引き起こされたこれらの制限に遭遇しました。
'Collection<Tのサブタイプ>から'Collection<T>'に変換できません
つまり、明らかにジェネリックスの不変性のために、以下は機能しません。
class Outer<TInner, TInnerItem> where TInner : Inner<TInnerItem>
{
public void Add(TInner item)
{
item.Outer = this; // ERROR:
// Cannot implicitly convert from Outer<TInner, TInnerItem>
// to Outer<Inner<TInnerItem>, TInnerItem>
}
}
class Inner<TInnerItem> : ICollection<TInnerItem>
{
Outer<Inner<TInnerItem>, TInnerItem> _outer;
public Outer<Inner<TInnerItem>, TInnerItem> Outer
{
set { _outer = value; }
}
}
(実際のコードでは、との両方Inner<>
をOuter<>
実装しICollection<>
ます。)
Inner<>
一部のデータにアクセスするには、オブジェクトにコンテナコレクションへの参照が必要です。
できれば上記の一般的なアプローチを使用して、これらのネストされたコレクションをどのように実装しますか?Inner<>
クラス内のコンテナコレクションへの参照をどのように設定しますか?
乾杯!