编译时间错误超类型集合引用引用的子类型集合对象

时间:2014-01-21 13:31:45

标签: c# generics inheritance compiler-errors polymorphism

我设计了我的实体类,以便可以在基类中设置抽象,因为我不想重复相同的代码。然而,在这样做的过程中,我已经达到了一个目的,我想要引用超类'泛型集合指向子类类型集合,但它吐出编译器错误。请参考下面的类骷髅,并建议我应该如何重新设计或解决问题,以便在测试方法中我不会收到任何错误。

请注意,如果您的解决方案是像我在baseRef3中所做的那样,那么这不是我想要的。我希望基类集合类引用指向类型化的子类集合对象。

public interface IEntity
{
}

public class BaseEntity : IEntity
{
}

public abstract class BaseEntityCollection<T> : List<T>
    where T : BaseEntity, new()
{
}

public class RealEntity : BaseEntity
{
}

public class RealEntityCollection : BaseEntityCollection<RealEntity>
{
}

public static void Test()
    {
        //Gives compile time error on both of below lines
        BaseEntityCollection<BaseEntity> baseRef1 = new RealEntityCollection();
        BaseEntityCollection<BaseEntity> baseRef2 = (BaseEntityCollection<RealEntity>)(new RealEntityCollection());

        //Following works with RealEntity in the refence but I do not want to keep ref to subtype rather base
        BaseEntityCollection<RealEntity> baseRef3 = new RealEntityCollection();         
    }

由于

编辑:我使用的是.NET 3.5,因此不确定是否支持Generics协方差。任何帮助高度赞赏!


我将设计简化为以下内容:

public interface IEntity
{
}

public class BaseEntity : IEntity
{
}

public class RealEntity : BaseEntity
{
}

public class RealEntityCollection : IEnumerable<RealEntity>
{
}

但是以下两行仍然会给出编译器错误:

IEnumerable<BaseEntity> baseRef1 = new RealEntityCollection();
IEnumerable<IEntity> baseRef2 = new List<RealEntity>();

然而,以下两个正在发挥作用:

IEnumerable<BaseEntity> baseRef3 = (IEnumerable<BaseEntity>)(new List<RealEntity>());
IEnumerable<IEntity> baseRef4 = (IEnumerable<IEntity>)(new List<RealEntity>());

实际上我不想让铸造耗费时间,所以上述两条线路看起来并不理想。有没有其他方法可以在.NET 3.5中解决这个问题?

1 个答案:

答案 0 :(得分:0)

BaseEntityCollection<RealEntity>不是BaseEntityCollection<BaseEntity>。否则你可以这样做:

BaseEntityCollection<BaseEntity> baseRef1 = new RealEntityCollection();
baseRef1.Add(new OtherRealEntity());

除非您更改BaseEntityCollection<T>的定义以使用像IEnuemerable<T>这样的协变接口,否则无法转换/转换/伪造编译器。