3

我正在尝试定义一个泛型类

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 类型参数施加约束,以便编译器知道它是引用或可为空的类型。

如何让编译器满意?

4

4 回答 4

7

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

where TDatabase : class, IDatabase

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

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

微软,?? 运算符(C# 参考)

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

于 2012-04-04T15:36:17.430 回答
1

您可以将约束更改为包含class吗?

public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>  
    where T : class 
    where TDatabase : class, IDatabase 
{
    //... 
}
于 2012-04-04T15:37:55.400 回答
1
where TDatabase : class, IDatabase 
于 2012-04-04T15:37:07.487 回答
1

尝试这个

public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T>
    where T : class
    where TDatabase : class, IDatabase
{
}
于 2012-04-04T15:40:29.470 回答