作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
以下抛出一个 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/445471/
我是一名优秀的程序员,十分优秀!