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());で、コンパイラは「'??'の左オペランド」と文句を言っています。演算子は参照型またはnull許容型である必要があります」

エラーは理解しましたが、TDatabase型パラメーターに制約を設定して、コンパイラーがそれが参照型またはnull許容型であることを認識できるようにする方法がわかりません。

コンパイラを幸せにするにはどうすればよいですか?

4

4 に答える 4

7

TDatabaseそれが参照型であることを示す必要があります

where TDatabase : class, IDatabase

MSDN、型パラメーターの制約(C#プログラミングガイド)

ここで、T: classtype引数は参照型である必要があります。これは、すべてのクラス、インターフェイス、デリゲート、または配列型にも当てはまります。

MSDN、?? 演算子(C#リファレンス)

?? 演算子はnull合体演算子と呼ばれ、null許容値型または参照型のデフォルト値を定義するために使用されます。オペランドがnullでない場合は、左側のオペランドを返します。それ以外の場合は、右のオペランドを返します。

于 2012-04-04T15:36:17.430 に答える
1
where TDatabase : class, IDatabase 
于 2012-04-04T15:37:07.487 に答える
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

これを試して

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