“类型 T 必须是引用类型才能将其用作参数”是啥意思?

Posted

技术标签:

【中文标题】“类型 T 必须是引用类型才能将其用作参数”是啥意思?【英文标题】:What does "The type T must be a reference type in order to use it as parameter" mean?“类型 T 必须是引用类型才能将其用作参数”是什么意思? 【发布时间】:2016-07-20 13:44:02 【问题描述】:

我正在尝试在我的 C#/MVC/Entity Framework 应用程序上创建一个通用控制器。

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 必须是引用类型才能用作参数。

当我将它限制为class 时,它就解决了。

Controller where T : class

错误是什么意思?我不是在寻求解决方案,我想了解为什么会发生此错误以及为什么将其限制为 class 可以解决它。

【问题讨论】:

不完整且不清楚。此外,这是一个值得商榷的设计选择。 @HenkHolterman 。为什么选择糟糕的设计? 它使您的控制器面向模型,它们应该面向视图。对 CRUD 来说是不必要的,对所有其他目的都是有害的。 T_Instance 从何而来?为什么它与 T 不同? 我明白了。这个类是一个父类,只有一些通用方法(列表、删除等)。我的其他控制器类将从这个父类继承。 “class CustomerController : GenericController ...” 所以,我不认为这是一个糟糕的设计。只是避免一些重复的代码。感谢您的建议@HenkHolterman 【参考方案1】:

如果你看DbSet&lt;TEntity&gt;的定义:

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
 ... 

【讨论】:

【参考方案2】:

它们显然对泛型类型有限制。

你需要改变的是:

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

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

【讨论】:

【参考方案3】:

你也可以只用一个方法来做:

public bool HasKey<T>(T obj) where T : class

    return _db.Entry<T>(obj).IsKeySet;

【讨论】:

以上是关于“类型 T 必须是引用类型才能将其用作参数”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

the hash for the file is not present in the specified catalog file,是啥意

java+p+=+new+JPanel(new+GridLayout(5,3,0,15));啥意?

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表啥意

带式输送机td75型,矩形头尾架,b1000mm,v=1.6m/h,q=500t/h,l=18.5m,h=1.95m,啥意

重新捡起flask

怎么根据用户ip地址转换成相应的省会地址