【发布时间】:2011-02-14 03:52:49
【问题描述】:
这是我面临的情况:
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 关键字时,编译器会抱怨 Invalid variance: The type parameter must be invariantly valid. p>
我有以下抽象类:
public abstract class FileProcessor : IDisposable
{
protected abstract ITableDataAccessLayer<TableRecord> CreateTableDataAccessLayer();
}
具体实现示例如下:
public class UserFileProcessor : FileProcessor
{
protected override ITableDataAccessLayer<TableRecord> CreateTableDataAccessLayer()
{
return new UserDataAccessLayer();
}
}
返回新的 UserDataAccessLayer();是编译器抱怨的地方。
【问题讨论】:
-
请发布一个简短但完整的程序来展示问题,这样您也可以获得具体的答案。
-
嗨 Lasse,我已根据您的建议对我的帖子进行了修改。任何帮助将不胜感激。
-
我也想查看整个 UserDataAccessLayer 定义,所有方法,但请稍等,让我添加一个答案,然后您看看是否有帮助。
标签: .net generics .net-4.0 covariance contravariance