理解InvalidCastException
与IEnumerable.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.Object
到 long
中。 这在功能上相当于:
<code class="language-csharp">int i = 1; object o = i; // Boxing long l = (long)o; // Unboxing and Cast - This throws the exception!</code>
InvalidCastException
发生在拆箱 步骤中。虽然从 int
到 long
的直接转换是有效的,但将装箱的 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中文网其他相关文章!