這裏是我面對的情景:.NET 4.0泛型不變,協變,反變
public abstract class Record { }
public abstract class TableRecord : Record { }
public abstract class LookupTableRecord : TableRecord { }
public sealed class UserRecord : LookupTableRecord { }
public interface IDataAccessLayer<TRecord>
where TRecord : Record { }
public interface ITableDataAccessLayer<TTableRecord> : IDataAccessLayer<TTableRecord>
where TTableRecord : TableRecord { }
public interface ILookupTableDataAccessLayer<TLookupTableRecord> : ITableDataAccessLayer<TLookupTableRecord>
where TLookupTableRecord : LookupTableRecord { }
public abstract class DataAccessLayer<TRecord> : IDataAccessLayer<TRecord>
where TRecord : Record, new() { }
public abstract class TableDataAccessLayer<TTableRecord> : DataAccessLayer<TTableRecord>, ITableDataAccessLayer<TTableRecord>
where TTableRecord : TableRecord, new() { }
public abstract class LookupTableDataAccessLayer<TLookupTableRecord> : TableDataAccessLayer<TLookupTableRecord>, ILookupTableDataAccessLayer<TLookupTableRecord>
where TLookupTableRecord : LookupTableRecord, new() { }
public sealed class UserDataAccessLayer : LookupTableDataAccessLayer<UserRecord> { }
現在,當我嘗試投UserDataAccessLayer它的通用基礎類型ITableDataAccessLayer<TableRecord>
,編譯器抱怨說,它不能隱式轉換類型。
當我嘗試在通用參數界面聲明中使用in
或out
關鍵字,編譯器會抱怨無效方差:類型參數必須是有效目不暇接。
我有以下的抽象類:
public abstract class FileProcessor : IDisposable
{
protected abstract ITableDataAccessLayer<TableRecord> CreateTableDataAccessLayer();
}
和樣本的具體實現如下:
public class UserFileProcessor : FileProcessor
{
protected override ITableDataAccessLayer<TableRecord> CreateTableDataAccessLayer()
{
return new UserDataAccessLayer();
}
}
回報新UserDataAccessLayer();是編譯器抱怨的地方。
請發佈一個簡短但完整的程序來展示問題,這樣您也可以獲得具體的答案。 – 2010-04-30 09:15:54
嗨Lasse,我已根據您的建議對我的帖子進行了修改。任何幫助將不勝感激。 – 2010-04-30 09:26:16
我希望看到整個UserDataAccessLayer定義,所有方法,但堅持,讓我添加一個答案,然後你可以看到是否有幫助。 – 2010-04-30 09:59:43