如何定义通用约束,以便我可以使用? 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类型参数设置约束,以便编译器知道它是引用类型或可为空类型。

如何让编译器高兴?

+0

啊,只是意识到我需要'TDatabase的地方:类,IDatabase' – 2012-04-04 15:36:05

+1

难道你只是想:回报分贝? DatabaseFactory.Get();这里? – dougajmcdonald 2012-04-04 15:37:09

+0

@dougajmcdonald不​​一定,它是一种懒惰的加载模式。 – NSGaga 2012-04-04 18:33:11

你必须表明TDatabase是引用类型

where TDatabase : class, IDatabase 

MSDN, Constraints on Type Parameters (C# Programming Guide)

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

MSDN, ?? Operator (C# Reference)

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

where TDatabase : class, IDatabase 
+0

它不可能是另一回合。 'class'约束必须是第一个约束 – RichK 2012-04-04 17:51:31

+0

现在不记得我头顶的命令,现在已经纠正 – 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 
{ 
}