当前位置:  开发笔记 > 编程语言 > 正文

令人费解的Enumerable.Cast InvalidCastException

如何解决《令人费解的Enumerable.CastInvalidCastException》经验,为你挑选了2个好方法。

以下抛出一个InvalidCastException.

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

为什么?

我正在使用Visual Studio 2008 SP1.



1> Matt Hamilto..:

那很奇怪!有一个博客张贴在这里,描述了如何的行为Cast().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()是一种扩展方法,IEnumerable而不是IEnumerable.这意味着当每个值到达它所投射的点时,它已经被装箱回System.Object.本质上,它试图这样做:

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

此代码抛出您正在获取的InvalidCastException.如果你试图直接将一个int转换为long,那么将一个盒装的int转换为long也行不通.

当然怪异!


@Timwi:对不起,但没有.请参阅我对上述评论的评论.
+1 - 我有这个确切的问题,阅读博客,无法解决.您的编辑清除了它.大!
根本没什么奇怪的.`.Cast `做**演员**.从int到long**的转换不是转换**.令人遗憾的是,C#选择对不同的操作使用相同的语法.

2> okutane..:

Enumerable.Cast方法定义如下:

public static IEnumerable Cast(
    this IEnumerable source
)

并且没有关于IEnumerable项的初始类型的信息,所以我认为你的每个int最初都是通过装箱转换为System.Object,然后它被尝试拆箱成长变量,这是不正确的.

类似的代码重现这个:

int i = 1;
object o = i; // boxing
long l = (long)o; // unboxing, incorrect
// long l = (int)o; // this will work

因此,您的问题的解决方案将是:

ints.Select(i => (long)i)

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有