C#。什么"类型T必须是引用类型才能将其用作参数。"手段?

时间:2016-07-20 13:44:02

标签: c# generics controller

我试图在我的MVC C#Entity Framework Application上创建一个通用控制器。

public class GenericRecordController<T> : Controller
{
    private DbSet<T> Table;
    // ... 

    public action(){
        // ... 
        db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified;
    }
}

然而,DbSet&lt; T &gt;并且 T_Instance 行有编译错误。

  

T 类型必须是引用类型才能将其用作参数。

当我为一个类

约束它时
Controller where T : class
它已经解决了。

上述错误意味着什么?

我没有要求解决方案。我想理解为什么会出现这个错误以及为什么限制它来解决它。

3 个答案:

答案 0 :(得分:20)

如果你看一下Db<TEntity>的定义:

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

因为它的type constraint泛型类型必须是class,所以必须使用与此条件匹配的类型对其进行初始化:

public class GenericRecordController<T> : Controller where T : class
{ ... }

答案 1 :(得分:7)

他们显然对泛型类型有约束。

您需要改变的是:

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

这告诉编译器只能提供引用类型作为T的类型。

答案 2 :(得分:1)

您也可以使用一种方法来完成此操作:

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

相关问题