如何定义通用约束,以便我可以使用? coalesing操作
我试图定义一个通用类如何定义通用约束,以便我可以使用? coalesing操作
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类型参数设置约束,以便编译器知道它是引用类型或可为空类型。
如何让编译器高兴?
你必须表明TDatabase
是引用类型
where TDatabase : class, IDatabase
MSDN, Constraints on Type Parameters (C# Programming Guide)
其中T:类类型参数必须是引用类型;这也适用于任何类,接口,委托或数组类型。
MSDN, ?? Operator (C# Reference):
的?运算符称为空合并运算符,用于为可为空的值类型或引用类型定义默认值。它 返回左操作数,如果操作数不为空;否则它会返回右操作数 。
where TDatabase : class, IDatabase
它不可能是另一回合。 'class'约束必须是第一个约束 – RichK 2012-04-04 17:51:31
现在不记得我头顶的命令,现在已经纠正 – 2012-04-05 12:48:51
您可以更改约束包括class
?
public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
where T : class
where TDatabase : class, IDatabase
{
//...
}
试试这个
public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
where T : class
where TDatabase : class, IDatabase
{
}
啊,只是意识到我需要'TDatabase的地方:类,IDatabase' – 2012-04-04 15:36:05
难道你只是想:回报分贝? DatabaseFactory.Get();这里? – dougajmcdonald 2012-04-04 15:37:09
@dougajmcdonald不一定,它是一种懒惰的加载模式。 – NSGaga 2012-04-04 18:33:11