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

Dan*_*tos 11 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,DbSet < T >和T_Instance行有编译器错误.

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

当我限制它为一个类

Controller where T : class
Run Code Online (Sandbox Code Playgroud)

它解决了.

上述错误意味着什么?

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

Gil*_*een 24

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

public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter 
where TEntity : class
Run Code Online (Sandbox Code Playgroud)

因为它具有type constraint泛型类型必须是a,class所以必须使用也匹配此条件的类型初始化它:

public class GenericRecordController<T> : Controller where T : class
{ ... }
Run Code Online (Sandbox Code Playgroud)


小智 10

你也可以只用一种方法来做到这一点:

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

Run Code Online (Sandbox Code Playgroud)


C.E*_*uis 8

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

您需要改变的是:

public class GenericRecordController<T> : Controller where T : class
Run Code Online (Sandbox Code Playgroud)

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