什么是“;类型T必须是引用类型,以便将其用作参数“”;意思是
本文关键字:意思是 参数 类型 什么 引用类型 | 更新日期: 2023-09-27 17:58:04
我正试图在我的C#/MVC/实体框架应用程序上创建一个通用控制器。
public class GenericRecordController<T> : Controller
{
private DbSet<T> Table;
// ...
public action()
{
// ...
db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified;
}
}
但是,DbSet<T>
和T_Instance
行存在编译器错误。
类型
T
必须是引用类型才能用作参数。
当我将其约束为class
时,它已被求解。
Controller where T : class
错误是什么意思我不是在寻求解决方案,我想了解为什么会出现这个错误,以及为什么将其约束为class
可以解决它。
如果您查看DbSet<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
{ ... }
它们显然对泛型类型有约束。
您只需要更改:
public class GenericRecordController<T> : Controller where T : class
这告诉编译器只能提供引用类型作为T的类型。
您也可以在一个方法上完成:
public bool HasKey<T>(T obj) where T : class
{
return _db.Entry<T>(obj).IsKeySet;
}