首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在这个例子中需要"where T: class“?

为什么在这个例子中需要"where T: class“?
EN

Stack Overflow用户
提问于 2016-03-09 20:55:38
回答 2查看 319关注 0票数 4

样本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename,  IEnumerable<T> data) where T : class    
{
    var engine = new FileHelperEngine((typeof(T)));


    engine.HeaderText = engine.GetFileHeader(); 
    engine.WriteFile(destFilename, data); // XX
}

在第XX行,engine.WriteFile的第二个参数期待一个IEnumerable。这段代码工作正常。

我的问题是,为什么方法需要"where T: class“约束?如果删除它,将得到编译时错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Argument 2: cannot convert from
'System.Collections.Generic.IEnumerable<T>' to
'System.Collections.Generic.IEnumerable<object>'

我原以为一切都是“对象”,所以没有必要加以约束?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-09 21:02:42

之所以需要约束,是因为object只是一个引用类型;可以将值类型分配给object的原因是装箱(尽管从技术上讲,所有类型都是从System.Object继承的)。

但是装箱是一个与类型参数方差不同的问题;具有无约束T的IEnumerable<T>不能转换为IEnumerable<object>,因为值类型不支持方差。

顺便说一下,FileHelperEngine<T> (非泛型FileHelperEngine继承自(作为FileHelperEngine<object>) )也有一个T : class约束。因此,您不会因为具有约束而缺少任何功能,因为无论如何都只支持引用类型--理论上可以直接使用FileHelperEngine<T>而不需要遍历非泛型类,因为示例中给出的方法已经是泛型的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename,  IEnumerable<T> data) where T : class    
{
    var engine = new FileHelperEngine<T>();


    engine.HeaderText = engine.GetFileHeader(); 
    engine.WriteFile(destFilename, data);
}
票数 6
EN

Stack Overflow用户

发布于 2016-03-10 04:50:42

您将将T应用于已经具有相同约束的FileHelperEngine<T>T : class。编译器可以判断,如果您不对您的方法施加相同的约束,那么T可能对FileHelperEngine<T>无效。所以这只是为了防止类型不匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35907892

复制
相关文章
T::class 和 this::class 的区别
前几天推送了一篇文章:你绝对想不到 Kotlin 泛型给反射留下了怎样的坑!,受到一位朋友的评论的启发,这篇文章就承接前文,探讨一下 T::class 和 this::class 区别。
bennyhuo
2020/02/20
1.3K0
select * from t_student where class between 200 and 300需要执行几次索引树的搜索操作,会扫描多少行
在这个过程中,回到主键索引树搜索的过程,我们称为回表。可以看到,这个查询过程读了 class_idx 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。
共饮一杯无
2022/11/28
2750
Mybatis中为什么要有<where> 标签,直接使用where的不好的地方
如果不使用,而是直接在 where 后边使用标签,但是如果所有的都是 false,就代表了都是空,sql 语句中 where 后边如果不跟相关的条件,是会报错的。
知识浅谈
2021/05/10
8510
MyBatis 中为什么不建议使用 where 1=1?
最近接手了一个老项目,“愉悦的心情”自然无以言表,做开发的朋友都懂,这里就不多说了,都是泪图片...
终码一生
2022/04/15
5990
MyBatis 中为什么不建议使用 where 1=1?
MyBatis 中为什么不建议使用 where 1=1?
接手老项目,自然是要先熟悉一下业务代码,然而在翻阅 mapper 文件时,发现了一个比较诡异的事情。这里给出简化后的业务代码:
磊哥
2021/11/15
7960
MyBatis 中为什么不建议使用 where 1=1?
delete from t1 where id = 10
在Next_Key Lock算法中,不仅仅锁定住所找到的索引,而且还锁定住这些索引覆盖的范围。因此在这个范围内的插入都是不允许的。这样就避免了在这个范围内插入数据导致的幻读问题。
NateHuang
2019/12/10
4320
MySQL中where条件查询(where)
ha_lydms
2023/08/09
2990
JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别
总结下泛型的好处就是 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上
Java编程指南
2019/08/02
1.6K0
java中为什么需要接口
最近看到论坛里有个帖子在讨论接口和抽象类的区别和作用,这其实也是很多面试官喜欢问的问题,这里我就说说我的总结,顺便说说内部类的作用,当是给刚入门,或者想学习java的同学们能更好的理解它们的用法。
bear_fish
2018/09/20
8920
class_ro_t 的探索
在 WWDC2020中有一个视频讲的是关于Objective—C 在运行时的一些优化,本篇文章是对视频中讲到的的部分知识点进行探索。
CC老师
2022/01/14
4310
class_ro_t 的探索
mybatis中 <where>标签
官方解释:where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
DencyCheng
2020/12/09
1.2K0
为什么需要敏捷的7个问题
在一次敏捷课程上,有一些大量有意思的问题,例如 “通过敏捷会让项目开发进度更快吗?”。其中一些也是几年前我想问的,并带着这些问题加入 ThoughtWorks。终于经过各种海内外敏捷项目,在一线开发有了对敏捷更为深刻的认识,现在回过头来聊一聊这些问题。
ThoughtWorks
2020/07/14
1.3K0
为什么客服需要中台战略(上)
最近从朋友圈到各种培训,大家到处都在谈论“中台”,阿里、腾讯、字节跳动、华为等知名互联网公司及科技公司都相继发布自己的中台战略。那么到底中台是个什么鬼?
云问科技
2019/10/15
2.7K0
为什么客服需要中台战略(上)
怎么获取泛型T.class类?
如上代码,要调用getA()方法,必须传入一个Class类,使用泛型怎么传递这个Class类呢?
hbbliyong
2018/12/14
3.4K0
C++ 中为什么需要虚函数
我最近正在学习 C++ 的虚函数,我知道虚函数是用于子类继承的,但虚函数什么时候才需要用它?因为我发现有的教科书上有用 virtual,有的又不用,我有点搞混了。
ClearSeve
2022/02/10
8790
R语言T检验的简单小例子
T检验是用来检验两组数据之间均值是否有差异的一种方法,比如下面我们用到的数据包括20个男生和20个女生的体重数据。
用户7010445
2020/08/07
1.5K0
R语言T检验的简单小例子
为什么SQL语句Where 1=1 and在SQL Server中不影响性能
    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能。最后结论是不影响。
_一级菜鸟
2022/11/16
2K0
为什么SQL语句Where 1=1 and在SQL Server中不影响性能
为什么需要一个激励函数
各位小伙伴们大家好,好久不见,今天让我们来一起聊一聊现代神经网络中必不可少的一个组成部分激励函数以及我们在机器学习中为什么少不了激励函数. 那首先第一个问题,什么是激励函数呢?首先用简单的语句进行概括
云时之间
2018/04/11
9510
为什么需要一个激励函数
为什么生活中也需要六西格玛
信不信由你,有一种方法可以对任务进行优先级排序,这意味着从一项任务到下一项任务没有空闲或浪费时间。每个任务都是在前一个任务的基础上分层的,最终为您的业务构建一个良好的流程。
用户9972271
2023/02/09
2730
点击加载更多

相似问题

为什么在这个例子中"T“不等于"T”?

34

为什么在这个例子中我们需要括号?

30

将Class<T> Where T: IMySampleInterface转换为Class<IMySampleInterface >

20

泛型继承和字段声明(class<T> where T: class<T>)

30

为什么在这个例子中我需要一个Handler对象?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文