首页 >后端开发 >C++ >为什么从'IEnumerable”进行转换时,'Enumerable.Cast”会抛出'InvalidCastException”?

为什么从'IEnumerable”进行转换时,'Enumerable.Cast”会抛出'InvalidCastException”?

Patricia Arquette
Patricia Arquette原创
2025-01-10 10:38:42695浏览

Why Does `Enumerable.Cast` Throw an `InvalidCastException` When Casting from `IEnumerable`?

Enumerable.Cast 中令人费解的 Cast 异常

尝试将整数 (int) 的 IEnumerable 转换为 IEnumerable 时遇到 InvalidCastException使用 Cast 运算符的长整数(longs),如图所示下面:

using System.Collections.Generic;
using System.Linq;

namespace InvalidCast
{
    class Program
    {
        static void Main(string[] args)
        {
            // Initialize a list of ints
            IEnumerable<int> list = new List<int>() { 1 };

            // Attempt to cast the list to longs
            IEnumerable<long> castedList = list.Cast<long>();

            // Attempt to write the first element of the casted list
            Console.WriteLine(castedList.First());
        }
    }
}

为什么会发生此异常?

此行为是意外的,因为 Cast 运算符旨在执行安全可靠的转换。然而,这个特殊案例展示了一个特殊问题,该问题是由于 .NET 3.5 和 .NET 3.5 SP1 之间的 Cast 行为修改而引起的。

问题的根源

Cast 运算符是为 IEnumerable(集合的基接口)定义的扩展方法,而不是专门为IEnumerable。这意味着当值被转换时,它们被装箱到 System.Object 类型的对象中。

因此,转换过程模仿以下内容:

int i = 1;
object o = i;
long l = (long)o;

此代码当它尝试将装箱 int 转换为 long 时抛出 InvalidCastException,而不是直接转换int.

解决方法

要解决此问题,需要使用 lambda 表达式或 select 方法显式执行转换,如下所示:

// Cast using a lambda expression
var castedList = list.Select(i => (long)i);

// Cast using a select method
var castedList = from long l in list select l;

这些方法显式地将每个 int 值转换为 long,避免装箱/拆箱过程并规避InvalidCastException。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn