2011-06-25 41 views
2

我有這些類,活動記錄模式的實現:無法施放從DerivedT <Derived2T>到巴塞特<base2T>

public abstract class RecordCollection<T> : ObservableCollection<T> where T : Record 
public abstract class Record : INotifyPropertyChanged 
我要定義一個數據庫的行(即聯繫)每次

,我創建一個新的記錄類,如:

public class Contact : Record 

和數據庫(即隱形眼鏡)的行的集合爲:

public class ContactCollection : RecordCollection<Contact> 

但在那之後我不能使用通用的包含記錄colletcion:

ContactCollection contColl = new ContactCollection(databaseman dbMan); 
contColl.Load(); 

RecordCollection<Record> recordColl = contColl; 

它給我「不能隱式類型轉換ContactCollection至>」。任何幫助,將不勝感激。

+1

你不是鑄造....你只是轉換 –

+0

我必須使用轉換器<在TInput,出TOUTput>? – elCairo

回答

6

這個轉換是不是簡單地允許的,因爲這可能發生:

public class AnotherTypeOfContact: Record {} 

現在我們可以這樣做:

recordColl.Add(new AnotherTpyeOfContact()) //runtime exception as no conversion between AnotherTypeOfContact and Contact 

這就是所謂協方差之間逆變read more here)泛型類型。爲此,contColl必須實現一個「out」的接口,而不是。我的意思是,對於被保存類型安全,contColl無法允許添加項目(更正式,T只能是一個方法的返回類型)

注意,在陣列這個允許,但其一個破的協方差,這是不幸的:more here

+0

所以我必須重構並得到一個IContactCollection接口(IRecordCollection不適用,據我所知)與出參數? ContactCollection:IContactCollection, 和IContactCollection:RecorCollection elCairo

+0

如果你想要的是枚舉集取的IEnumerable''這是T中逆變和'ObservableCollection' – InBetween

+0

不行,我必須有存取權限RecordCollection的一些性質實現優勢,而不僅僅是可觀察的集合。如果我想要這個功能,我必須改變方法。謝謝回覆。 – elCairo

相關問題