泛型小经验
2. 泛型在集合的管理中非常好用,像 List<T> 毋庸置疑是最常用的集合。但当两个集合的 T 具有派生关系时,子类集合不能转换成父类集合,显式或隐式转换都不行。比如定义如下父子两个类:
public class ParentClass { }
public class ChildClass : ParentClass { }
下面这句话会发生编译错误:
List<ParentClass> ps = new List<ChildClass>() as List<ParentClass>;
编译器提示:
无法通过引用转换、装箱转换、取消装箱转换、包装转换或 Null 类型转换将类型“System.Collections.Generic.List<ChildClass>”转换为“System.Collections.Generic.List<ParentClass>”
这似乎很不合理,我把子类对象集合转换成父类对象集合,“父类引用指向子类对象”,平时经常这么干为啥这次就不行了呢?
仔细想一下,因为我们用的是 List<T> 类型,而不是某个类似 List(T) 的方法。在程序运行时,JIT 编译器会根据实际情况把 T 替换成相应的类型,替换后的 List<ParentClass> 跟 List<ChildClass> 是不同的类型,而且也没有派生关系,自然就不能转换了。总之,泛型的 T 被用某个类型实例化后,泛型就成了一种新的确定的类型,记住这点就够了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2005-07-21 海水涨落潮规律