如何定义通用约束以便我可以使用?合并运营商

sco*_*coe 3 c# generics

我正在尝试定义泛型类

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());
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在线return db ?? (db = DatabaseFactory.Get());,编译器抱怨"左'的操作数'??' 运算符应该是引用或可空类型"

我理解错误,但不知道如何对TDatabase类型参数设置约束,以便编译器知道它是引用或可空类型.

如何让编译器开心?

sll*_*sll 7

您必须指明这TDatabase是一种引用类型

where TDatabase : class, IDatabase
Run Code Online (Sandbox Code Playgroud)

MSDN,类型参数约束(C#编程指南)

其中T:class 类型参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型.

MSDN,?? 运算符(C#参考):

?? ?? operator被称为null-coalescing运算符,用于为可空值类型或引用类型定义默认值.如果操作数不为null,则返回左侧操作数; 否则返回正确的操作数.