0

0

c# 协变和逆变是什么

畫卷琴夢

畫卷琴夢

发布时间:2026-01-03 02:39:31

|

890人浏览过

|

来源于php中文网

原创

协变(out)和逆变(in)是C#编译期强制校验的类型安全机制:out用于只输出(返回值)的泛型参数,支持子类→父类转换;in用于只输入(参数)的泛型参数,支持父类→子类转换;二者不可共存,且仅适用于接口和委托。

c# 协变和逆变是什么

协变逆变是 C# 中让泛型接口和委托支持“安全类型转换”的机制,不是语法糖,也不是运行时魔法——它们由编译器在编译期强制校验,核心目标只有一个:在保持类型安全的前提下,让继承关系能自然地“传导”到泛型参数上

为什么 IEnumerable 能直接赋值给 IEnumerable

因为 IEnumerable 声明了 T 是协变的(用 out 修饰),意味着:只要 stringobject 的子类,那 IEnumerable 就可隐式转为 IEnumerable。这符合直觉——你从集合里“读出来”的东西,子类能当父类用(里氏替换原则)。