How do I define a generic constraint so that I can use the ?? coalesing operator

c#, generics

Solution

You have to indicate that `TDatabase` is a reference type

where TDatabase : class, IDatabase

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

where T : class The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

MSDN, ?? Operator (C# Reference):

The ?? operator is called the null-coalescing operator and is used to define a default value for nullable value types or reference types. It returns the left-hand operand if the operand is not null; otherwise it returns the right operand.

Problem

I'm trying to define a generic class ``` 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()); } } ... } ``` On the line `return db ?? (db = DatabaseFactory.Get());`, the compiler is complaining with "Left operand of the '??' operator should be of reference or nullable type" I understand the error, but don't know how to put a constraint on the TDatabase type parameter so that the compiler knows it is a reference or nullable type. How to I make the compiler happy?

Original source