2012-04-04 56 views
3

我試圖定義一個通用類如何定義通用約束,以便我可以使用? 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

回答

7

你必須表明TDatabase是引用類型

where TDatabase : class, IDatabase 

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

其中T:類類型參數必須是引用類型;這也適用於任何類,接口,委託或數組類型。

MSDN, ?? Operator (C# Reference)

的?運算符稱爲空合併運算符,用於爲可爲空的值類型或引用類型定義默認值。它 返回左操作數,如果操作數不爲空;否則它會返回右操作數 。

1
where TDatabase : class, IDatabase 
+0

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

+0

現在不記得我頭頂的命令,現在已經糾正 – 2012-04-05 12:48:51

1

您可以更改約束包括class

public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T> 
    where T : class 
    where TDatabase : class, IDatabase 
{ 
    //... 
} 
1

試試這個

public abstract class RepositoryBase<TDatabase, TKey, T> : IRepository<TKey, T> 
    where T : class 
    where TDatabase : class, IDatabase 
{ 
} 
相關問題