2012-04-20 92 views
0

我將與代碼開始泛型集合不工作

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'改爲'TypeAColl撓度」。一個顯式轉換存在(是否缺少強制轉換?)」

我得改

TypeACollection typeAs2 = typeAs.Copy() as TypeACollection; 

編譯通過,但在運行時的錯誤了。typeAs2返回爲空甚至typeAs不爲null。

+0

在TypeACollection中你有具體的行爲,值得創建一個新的類,而不是僅僅使用LocDataCollection ? – Mike 2012-04-20 20:39:09

+0

是的,TypeACollection中還有其他函數。 – weslleywang 2012-04-20 23:18:20

回答

4

typeAs.Copy()返回LocDataCollection<TypeA>,但你不能將其中的一個到TypeACollection因爲TypeACollectionLocDataCollection<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具體的東西有,除非你加入覆蓋那個效果。

但是我並不十分了解您的問題,以確信這是一個合適的解決方案。