Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does "The type T must be a reference type in order to use it as parameter" mean?

I'm trying to create a generic controller on my C#/MVC/Entity Framework application.

public class GenericRecordController<T> : Controller {     private DbSet<T> Table;     // ...       public action()     {         // ...          db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified;     } } 

However the DbSet<T> and T_Instance line has a compiler error.

The type T must be a reference type in order to use it as parameter.

When I constrain it as a class, it was solved.

Controller where T : class 

What does the error mean? I'm not asking for a solution, I would like to understand why this error occurs and why constraining it as a class solves it.

like image 952
Daniel Santos Avatar asked Jul 20 '16 13:07

Daniel Santos


1 Answers

If you look at the definition of DbSet<TEntity>:

public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter  where TEntity : class 

Because it has a type constraint that the generic type must be a class then you must initialize it with a type that also matches this condition:

public class GenericRecordController<T> : Controller where T : class { ... } 
like image 117
Gilad Green Avatar answered Sep 21 '22 18:09

Gilad Green