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

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

Patricia Arquette
发布: 2025-01-10 10:38:42
原创
741 人浏览过

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中文网其他相关文章!

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