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

时间:2012-04-04 15:34:00

标签: 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());
        }
    }
    ...
}

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

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

如何让编译器满意?

4 个答案:

答案 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
{
}