You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何IEnumerable<int>不是IEnumerable<object>?协变特性技术疑问

关于IEnumerable协变的疑问解答

首先得明确:.NET里的泛型协变(比如IEnumerable<out T>里的out关键字)只支持引用类型,值类型不享受这个隐式转换的待遇。

  • string是引用类型,它和object之间是引用层面的继承关系,所以IEnumerable<string>可以直接隐式转为IEnumerable<object>——本质上是同一个集合对象,只是对外暴露的元素类型被当成了更上层的引用类型。
  • int是值类型,它和object的关系是装箱/拆箱,不是引用继承。当你想把IEnumerable<int>转成IEnumerable<object>时,每个int元素都需要被装箱成object对象,这意味着要创建一个全新的包装集合来处理每个元素的装箱操作,而不是简单的类型转换。这种转换不能隐式进行,必须显式处理,比如用.Cast<object>()或者.Select(x => (object)x)来实现。

举个代码例子更清楚:

// 合法:string是引用类型,协变支持隐式转换
IEnumerable<string> strList = new List<string> { "a", "b" };
IEnumerable<object> objList1 = strList;

// 不合法:int是值类型,无法隐式协变转换
IEnumerable<int> intList = new List<int> { 1, 2 };
// IEnumerable<object> objList2 = intList; // 编译错误

// 必须显式处理装箱
IEnumerable<object> objList2 = intList.Cast<object>();

简单总结:协变的隐式转换只适用于引用类型之间的继承关系,值类型和object之间是装箱关系,不属于协变支持的范畴,所以不能直接隐式转换。

内容的提问来源于stack exchange,提问作者Alex Broitman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:10:17