代码之家  ›  专栏  ›  技术社区  ›  Adrian Serafin

c#,泛型类型问题

  •  3
  • Adrian Serafin  · 技术社区  · 16 年前

    我有基类:

    class ARBase<T> : ActiveRecordValidationBase<T> where T : class
    {
    }
    

    而且很少有儿童班

    class Producent : ARBase<Producent>
    {
    }
    
    class Supplier : ARBase<Supplier>
    {
    }
    

    public IList<ARBase<Object>> MyCollection 
    {
    }
    

    我希望能够分配供应商集合或产品集合,但我得到了一个错误:不能强制转换 List<Producent> IList<ARBase<Object>> ...

    有人知道答案吗?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Jon Skeet    16 年前

    基本上,问题是.NET泛型不支持这样的协变性-在某些情况下支持协变性,但只支持接口和委托,而C#从版本4起才支持协变性( IList<T> T 在“入”和“出”两种意义上。)

    举个可能出错的例子,想象一下有人添加了 Supplier 一系列 Producer 您不希望允许这样做,但如果您可以转换 List<Producer> IList<ARBase<object>>

    您希望您的消费者能够对您的财产做些什么?这将建议如何进行。