我正在尝试定义泛型类
public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
where T : class
where TDatabase : IDatabase
{
private TDatabase db;
private readonly IDbSet<T> dbset;
protected IDatabaseFactory<TDatabase> DatabaseFactory { get; private set; }
protected TDatabase Database
{
get
{
return db ?? (db = DatabaseFactory.Get());
}
}
...
}
在return db ?? (db = DatabaseFactory.Get());
行上,编译器抱怨“??'的左操作数'运算符应该是引用或可空类型“
我理解错误,但不知道如何对TDatabase类型参数设置约束,以便编译器知道它是引用或可空类型。
如何让编译器满意?
答案 0 :(得分:7)
您必须指出TDatabase
是参考类型
where TDatabase : class, IDatabase
MSDN, Constraints on Type Parameters (C# Programming Guide)
其中T:class type参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。
MSDN, ?? Operator (C# Reference):
?? operator被称为null-coalescing运算符并且习惯于 为可空值类型或引用类型定义默认值。它 如果操作数不为null,则返回左侧操作数;否则它 返回正确的操作数。
答案 1 :(得分:1)
where TDatabase : class, IDatabase
答案 2 :(得分:1)
您可以更改约束以包含class
吗?
public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
where T : class
where TDatabase : class, IDatabase
{
//...
}
答案 3 :(得分:1)
试试这个
public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
where T : class
where TDatabase : class, IDatabase
{
}