c# – 嵌套泛型集合:如何实现从项到容器的引用?

在使用嵌套泛型集合实现设计时,我偶然发现了由C#的不变泛型引起的那些局限:

Cannot convert from 'Collection<subtype of T> to '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<&gt ;.) 我需要Inner<>对象具有对其容器集合的引用,以便访问其某些数据.

您将如何实现这些嵌套集合,最好使用上面概述的通用方法?如何在Inner<>中设置对容器集合的引用?类?

干杯!

解决方法:

引入一个不依赖于TInner的(可能是抽象的)基类可以帮助您:

abstract class OuterBase<TInnerItem>
{
}

class Outer<TInner, TInnerItem> : OuterBase<TInnerItem> where TInner : Inner<TInnerItem>
{
    public void Add(TInner item)
    {
        item.Outer = this; // Compiles
    }
}

class Inner<TInnerItem> : ICollection<TInnerItem>
{
    OuterBase<TInnerItem> _outer;

    public OuterBase<TInnerItem> Outer
    {
        set { _outer = value; }
    }
}

或者等待C#4.0,它引入了co / contra-variant通用接口.

上一篇:如何在Python中使用N行的csv文件创建嵌套字典


下一篇:javascript – AngularJS:从内部返回一个承诺.then?