通用集合不起作用

时间:2012-04-20 20:18:53

标签: .net generics collections

我将从代码

开始
class LocData 
{
    public virtual TypeA Copy () { ... }
    ...
}

class LocDataCollection<T> : List<T> where T: LocData
{
    public LocDataCollection<T> Copy() 
    {
        LocDataCollection<T> locDatas = new LocDataCollection<T>();
        foreach (T locData in this)
        {
            T locData2 = locData.Copy() as T;
            locDatas.Add(locData2);
        }
        return locDatas;
    }
  ...
}

class TypeA : LocData
{
  public new TypeA Copy () { ... }
  ...
}

class TypeACollection : LocDataCollection<TypeA>
{
}

测试代码:

TypeACollection typeAs = new TypeACollection();
...
TypeACollection typeAs2 = typeAs.Copy();

编译消息:

“无法将类型'LocDataCollection'隐式转换为'TypeACollection'。存在显式转换(您是否错过了转换?)”

我必须改为

TypeACollection typeAs2 = typeAs.Copy() as TypeACollection;

编译传递但在运行时错误输出。 typeAs2返回null甚至typeAs不为null。

1 个答案:

答案 0 :(得分:4)

typeAs.Copy()返回LocDataCollection<TypeA>。但是,您无法将其中一个分配给TypeACollection,因为TypeACollection的派生程度高于LocDataCollection<TypeA>

您可以通过使复制方法收到LocDataCollection<T>

来解决问题
class LocDataCollection<T> : List<T> where T: LocData
{
    public void CopyTo(LocDataCollection<T> dest) 
    {
        ....
    }
}

然后在通话网站:

TypeACollection typeAs = new TypeACollection();
TypeACollection typeAs2 = new TypeACollection();
typeAs.CopyTo(typeAs2);

当然,这不会复制任何TypeACollection特定内容,除非您添加了覆盖效果。

但我对你的问题不太了解,不能确信这是一个合适的解决方案。