首页 > 后端开发 > C++ > 为什么'IEnumerable.Cast”会抛出'InvalidCastException”?

为什么'IEnumerable.Cast”会抛出'InvalidCastException”?

DDD
发布: 2025-01-10 07:37:43
原创
343 人浏览过

Why Does `IEnumerable.Cast` Throw an `InvalidCastException`?

理解InvalidCastExceptionIEnumerable.Cast

尝试使用 IEnumerable<int>IEnumerable<long> 转换为 Cast<T> 通常会导致令人困惑的 InvalidCastException。 这个看似简单的操作由于 Cast<T> 方法中的微妙机制而失败。考虑这个例子:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());</code>
登录后复制

根本原因:装箱和拆箱

理解这一点的关键在于Cast<T>如何工作。 它是 IEnumerable 上的扩展方法,而不是 IEnumerable<T>。这意味着在尝试转换为 IEnumerable<int> 之前, 中的每个元素首先被 装箱System.Objectlong 中。 这在功能上相当于:

<code class="language-csharp">int i = 1;
object o = i;  // Boxing
long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
登录后复制

InvalidCastException 发生在拆箱 步骤中。虽然从 intlong 的直接转换是有效的,但将装箱的 int 拆箱到 long 是无效的。

分辨率

要避免这种 InvalidCastException,请使用在强类型 IEnumerable<T> 上下文中处理转换的方法,例如 Select:

<code class="language-csharp">IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Select(x => (long)x);
Console.WriteLine(castedList.First());</code>
登录后复制

此方法在int装箱发生之前直接对每个元素执行强制转换,从而防止InvalidCastException。 与依赖 Select 进行此类转换相比,使用 Cast<T> 提供了更干净、更高效的解决方案。

以上是为什么'IEnumerable.Cast”会抛出'InvalidCastException”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板