C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】

协变(out)和逆变(in)仅适用于接口和委托,协变允许更具体的类型赋给更宽泛的类型变量,仅限返回值、get访问器等输出位置;逆变则用于输入位置如方法参数,仅限接口和委托;类不支持协变或逆变。协变(out)只适用于接口和委托,且只能用在输出位置协变允许你把更具体的类型赋给更宽泛的类型变量,比如 IEnumerable<string> 能赋给 IEnumerable<object>。但这不是所有泛型都支持------只有标记了 out 的类型参数才允许协变,而且它**只能出现在返回值、属性 get 访问器、方法返回类型中**,不能出现在参数、字段或 set 访问器里。常见错误现象:void Add(T item) 里用了 out T,编译直接报错 CS1961:"类型参数 T 具有无效的方差"。IEnumerable<T>、IComparer<out T>、Func<out T> 是典型协变接口/委托自定义接口要协变,必须显式写 interface IProducer<out T>,且所有 T 出现位置都得是"只读"的类不支持协变或逆变------class List<out T> 是非法语法逆变(in)只用于输入位置,且仅限接口和委托逆变让你把更宽泛的类型传给更具体的期望,比如 Action<object> 可以赋给 Action<string>(因为 string 是 object 的子类,而 Action 只消费参数,不返回它)。逆变的关键是:类型参数只能出现在**参数位置**,不能用于返回值或属性 get。使用场景:当你需要一个"能处理任意父类的委托",但实际只想传子类实例时,逆变就省去了手动包装。Action<in T>、IComparer<in T>、Predicate<in T> 是典型逆变接口/委托错误写法:T GetFirst() 出现在 interface IConsumer<in T> 里 → 编译失败 CS1961注意 IComparer<T> 同时支持 in 和 out?不对。.NET 中它是 IComparer<in T>,因为比较逻辑只接收两个 T 参数,不返回 T泛型类永远不支持 in/out,别试了你没法给 class Box<T> 加 in 或 out。C# 语言规范明确禁止------类的类型参数必须是不变的(invariant)。这是因为类既有输入(构造函数、方法参数),又有输出(属性、返回值),无法统一满足协变或逆变约束。 Tellers AI Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

相关推荐
用户83562907805119 小时前
Python Word 转 PDF 和 PDF 转 Word 指南
后端·python
用户83562907805119 小时前
如何使用 Python 加密和保护 Word 文档
后端·python
sky_81061319 小时前
Oracle ERP 各模块业务管理功能及底层表说明
数据库·oracle
Fluxproxy19 小时前
AI数据集采集、批量模型推理报错频发?AI项目网络稳定性优化实战
python·ai·ai编程
Fanta丶20 小时前
10.Python class类的定义和魔术方法
python
YMatrix 官方技术社区20 小时前
CittaBase vs. Neo4j :原生图性能实测与混合检索实践
数据库·功能测试·ymatrix
花生了什么事o21 小时前
JVM 垃圾回收:对象如何被判定和回收
java·jvm
闲猫21 小时前
LangChain / Integrations / Integrations by component / Tool
java·数据库·langchain
xqqxqxxq21 小时前
SQL 连接查询技术笔记
数据库·笔记·sql
小玮看世界21 小时前
[Python]从“脏”数据到优雅实现:一个IoT滑动窗口最大值问题的测试驱动优化实录
linux·前端·python