什么是“;类型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可以解决它。

什么是“;类型T必须是引用类型,以便将其用作参数“”;意思是

如果您查看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;
}