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

自闭症网瘾萝莉.ら 提交于 2019-12-10 01:47:32

问题


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.


回答1:


If you look at the definition of Db<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
{ ... }



回答2:


They apparently have a constraint on the generic type.

All you need to change is:

public class GenericRecordController<T> : Controller where T : class

This tells the compiler that only reference types may be supplied as a type for T.




回答3:


You can do it on just a method as well:

        public bool HasKey<T>(T obj) where T : class
        {
            return _db.Entry<T>(obj).IsKeySet;
        }



来源:https://stackoverflow.com/questions/38483045/what-does-the-type-t-must-be-a-reference-type-in-order-to-use-it-as-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!