gpt4 book ai didi

c# - 令人费解的 Enumerable.Cast InvalidCastException

转载 作者:行者123 更新时间:2023-11-30 18:14:37 25 4
gpt4 key购买 nike

以下抛出一个 InvalidCastException

IEnumerable<int> list = new List<int>() { 1 };
IEnumerable<long> castedList = list.Cast<long>();
Console.WriteLine(castedList.First());

为什么?

我使用的是 Visual Studio 2008 SP1。

最佳答案

这很奇怪!有一篇博文 here描述了 Cast<T>() 的行为在 .NET 3.5 和 .NET 3.5 SP1 之间发生了变化,但它仍然没有解释 InvalidCastException,如果您这样重写代码,您甚至会得到:

var list = new[] { 1 };
var castedList = from long l in list select l;
Console.WriteLine(castedList.First());

显然,您可以通过自己进行转换来解决这个问题

var castedList = list.Select(i => (long)i);

这有效,但它并没有首先解释错误。我尝试将列表转换为 short 和 float,但它们抛出了相同的异常。

编辑

那篇博文确实解释了为什么它不起作用!

Cast<T>()IEnumerable 上的扩展方法而不是 IEnumerable<T> .这意味着当每个值到达它被转换的点时,它已经被装箱回 System.Object。本质上,它试图这样做:

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

此代码会抛出您收到的 InvalidCastException。如果您尝试将 int 直接转换为 long 就没问题,但是将 boxed int 转换回 long 是行不通的。

当然是个怪人!

关于c# - 令人费解的 Enumerable.Cast InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com