首页 > 后端开发 > C++ > 为什么'IEnumerable.Cast()”在 .NET 3.5 SP1 中抛出'InvalidCastException”?

为什么'IEnumerable.Cast()”在 .NET 3.5 SP1 中抛出'InvalidCastException”?

Patricia Arquette
发布: 2025-01-10 08:15:42
原创
514 人浏览过

Why Does `IEnumerable.Cast()` Throw an `InvalidCastException` in .NET 3.5 SP1?

解开Enumerable.Cast()抛出InvalidCastException的谜团

在.NET 3.5 SP1中,使用Cast<T>()转换IEnumerable时,令人费解地抛出了InvalidCastException异常。考虑以下代码:

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

为什么这段代码会抛出异常?

这种异常行为源于.NET 3.5和.NET 3.5 SP1之间Cast<T>()方法行为的改变。在SP1之前,Cast<T>()作用于IEnumerable<T>,允许直接转换。然而,在SP1中,它被修改为作用于IEnumerable,这意味着元素在转换之前会被拆箱为System.Object

这种拆箱操作会导致InvalidCastException,因为与直接将int转换为long不同,不允许将已装箱的int转换为long。实际上,这段代码尝试执行以下操作:

<code class="language-csharp">int i = 1;
object o = i;
long l = (long)o;</code>
登录后复制

这也会导致相同的InvalidCastException

解决方法和解释

为了解决这个问题,可以使用lambda表达式显式转换元素:

<code class="language-csharp">var castedList = list.Select(i => (long)i);</code>
登录后复制

这将成功地将元素转换为long

这种行为的原因在于Cast<T>()IEnumerable的扩展方法,而不是IEnumerable<T>的扩展方法。当元素到达转换阶段时,它们已经被装箱为object。当从object转换为特定类型时,这会导致InvalidCastException

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

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