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是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

相关推荐
Pkmer1 小时前
LeetCode 上极少见的工程级滑窗实现
python·leetcode
m0_463672201 小时前
SQL优化SQL关联查询中的排序字段_减少临时空间占用与内存开销
jvm·数据库·python
我叫Double1 小时前
简易版的EINO基于redis库的向量搜索项目v2
数据库·redis·bootstrap
FreakStudio1 小时前
开源分享|用MicroPython 做了个 AI 小鸡,它会长大,还记得我所有的情绪
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
iuvtsrt1 小时前
存储过程如何处理海量数据的批处理_循环提交与分段LIMIT结合
jvm·数据库·python
yexuhgu1 小时前
SQL如何检查字符串是否存在:INSTR与LOCATE函数使用
jvm·数据库·python
2301_783848651 小时前
SQL如何用SQL子查询实现关联报表生成_嵌套逻辑关联多表
jvm·数据库·python
八月欢喜1 小时前
【Facebook】 实时消息监控难点解析
javascript·python·facebook
l1t2 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python