C#中作为泛型协变类型的struct转换为object失败有什么解决方法?
问题解答
你对协变规则的理解存在偏差,.NET 泛型的协变与逆变仅支持引用类型之间的类型转换,值类型不在协变的支持范围内,这是.NET 运行时的设计规则,并非异常问题。
核心原因
你猜测的「值类型转object需要装箱」是根本原因:
- 引用类型之间的转换仅修改引用的类型标识,不需要改变对象本身的内存布局,
Succeeds实例引用转object引用不需要额外操作,因此IEnumerable<Succeeds>可以直接复用原有实现转换为IEnumerable<object>。 - 值类型转
object需要执行装箱操作,在堆上生成新的对象实例,这意味着IEnumerable<Fails>迭代返回的原始值类型数据,无法直接适配IEnumerable<object>要求的返回装箱引用的逻辑,运行时无法直接完成类型转换。
解决方案
最常用的方案是使用 LINQ 提供的 Cast<T>() 方法显式完成逐元素的装箱转换,你可以把报错的代码修改为:
var castFails = Enumerable.Empty<Fails>().Cast<object>();
该方法会在迭代每个元素时主动执行装箱操作,返回的就是符合要求的 IEnumerable<object> 实例。
如果是自定义协变泛型接口的场景,也可以手动封装一层适配逻辑,对值类型参数做装箱处理后再对外暴露object版本的接口实现。
内容的提问来源于stack exchange,提问作者Efraim Bart
相关产品推荐
相关产品推荐

