当前位置: 首页 > news >正文

C#-泛型学习笔记

C#泛型——约束|协变|逆变

1、泛型使用

在生命时可以使用<>,可以写一个标识符代替一些数据类型,在声明时给出明确定义。
非常强大,因此需要约束。

2、泛型约束

where T: struct//值类型约束,要求泛型必须为基本数据类型
where T: class //引用类型约束,要求泛型必须为类类型
where T: new()//默认构造方法约束,要求泛型必须有默认构造方法(抽象类abstract、接口interface、密封类sealed等都不可以)
多重约束之间用逗号隔开

3、泛型&协变与逆变

(1)协变(子转父)与逆变(父转子)

泛型是一种不指定的数据类型,不同的泛型之间没有继承关系。
但通过泛型定义的类在使用时需要指定泛型的具体类型,这些具体类型之间有时会具备父子关系。
通常情况下,同一个使用泛型的类在不同具体的实例化的同时,对象引用之间不允许相互赋值。
也就是说,A和A之间没有父子关系,默认为不变关系(没有关系)。
这个时候逆变、协变、和不变关系只能自己声明。

(2)使用泛型时协变与逆变的声明out/in

delegate T d1<out T> ();//协变声明
delegate void d2<in T> (T t);//逆变声明

声明协变泛型后, 使用子类的委托对象 可以向 使用父类泛型的委托引用 赋值:

d1<Dog> d11 = MakeAnimal;
d1<Animal> d12 = d11;

声明逆变泛型后, 使用父类的委托对象 可以向 使用子类泛型的委托引用 赋值:

d2<Animal> d21 = MakeAnimal2;
d2<Dog> d22 = d21;

协变泛型只能做返回值,逆变泛型只能做参数。

(3)适用范围

泛型接口和泛型委托
个人感觉是因为泛型接口和泛型委托只能出现在赋值表达式的左侧,作为被赋值的一方,
泛型类有可能不需要声明引用,泛型方法不可能作为对象引用出现在赋值表达式的左侧。

http://www.lryc.cn/news/454920.html

相关文章:

  • Java第二阶段---11封装---第四节 static 修饰符
  • 【C/C++】错题记录(五)
  • 关系数据库标准语言SQL(11,12)
  • Oracle 11g RAC 节点异常重启问题分析
  • vscode 中显示 pnpm : 无法加载文件 C:\Users\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本
  • C嘎嘎入门篇:类和对象番外(时间类)
  • Spring Boot项目实战教程:快速构建Web应用与RESTful API
  • OpenAI 开发者大会!实时语音功能有API了,GPT-4o支持多模态微调,上下文cache功能上线
  • 解决ros2 rviz Fixed Frame No TF data问题
  • Python数据分析篇--NumPy--进阶
  • 基于Arduino的宠物食物分配器
  • make和Makefile
  • 【数学分析笔记】第4章第4节 复合函数求导法则及其应用(2)
  • 【预备理论知识——2】深度学习:线性代数概述
  • 【目标检测】yolo的三种数据集格式
  • 数据分析案例-机器学习工程师薪资数据可视化分析
  • Django连接Dify、ChatGPT4o并计算tokens数量方法
  • 面试系列-淘天提前批面试
  • 计算机中科学中有哪些空间换时间的操作??
  • Mac安装Manim并运行
  • leetcode58:最后一个单词的长度
  • 18448 最小生成树
  • 前端工程化 - Vue
  • 使用 NVIDIA H100 上的 Azure 机密计算释放隐私保护 AI 的潜力
  • 目标检测与图像分类:有什么区别?各自的使用场景是什么?
  • Lua 数据类型
  • 复现文章:R语言复现文章画图
  • 东方仙盟——软件终端架构思维———未来之窗行业应用跨平台架构
  • 支持向量机(SVM)基础教程
  • Python小示例——质地不均匀的硬币概率统计