如何定义通用约束以便使用??上煤操作员

本文关键字:何定义 操作员 约束 定义 | 更新日期: 2023-09-27 18:30:12

我正在尝试定义一个通用类

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());行,编译器抱怨"‘??’运算符的左操作数应为引用或可为null类型"

我理解这个错误,但不知道如何对TDatabase类型参数施加约束,以便编译器知道它是引用或可为null的类型。

如何让编译器满意?

如何定义通用约束以便使用??上煤操作员

您必须指出TDatabase是一个引用类型

where TDatabase : class, IDatabase

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

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

MSDN??操作员(C#参考):

??运算符被称为null合并运算符,用于为可为null的值类型或引用类型定义默认值。它如果操作数不为null,则返回左侧操作数;否则返回右操作数。

您能更改约束以包含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
{
}
where TDatabase : class, IDatabase