System.InvalidCastException with iennumrable cast.

问题描述 投票:0回答:1

为什么我看到 System.InvalidCastException 对于下面的代码?

object[] obj = new object[5];
obj[0] = 1;
obj[0] = 2;
obj[0] = 3;
obj[0] = 4;
obj[0] = 5;
var exc = obj.Cast<string>().ToList();

无法铸造类型为 System.Int32 键入 System. String.

c# casting ienumerable
1个回答
1
投票

你有两个问题。

  1. 你做了一个假设 int 可以直接投向 string (在不能)
  2. 你认为,如果 #1 是有效的,即 Cast<T> 铸就

要通过第一个问题,你可以简单地使用以下方法来投射源代码 Select 并称 ToString 中的选择函数(我在下面假设您并没有打算将 五项数值均为指数 0 但实际上是要把数组全部填满)。)

var obj = new object[] { 1, 2, 3, 4, 5 };
var result = obj.Select(c => c.ToString()).ToList();

或者你可以使用 Convert.ToString:

var obj = new object[] { 1, 2, 3, 4, 5 };
var result = obj.Select(c => Convert.ToString(c)).ToList();

这两点都消除了 "需要"。Cast<> 解决问题 #2 在这个过程中。

需要注意的是,即使有一个。implicitexplicit 改用 intstring,即 Cast<int> 执行施放。这是因为该函数依赖于一个 通用铸模 不调用转换运算符。源对象必须与通用参数的类型相同。Cast 用于非通用的 IEnumerable 前存在的集合,允许你转换为一个 IEnumerable<T> 来启用使用LINQ操作。例如(分成几个部分):

DataTable dt = GetDataTable();
DataRowCollection drc = dt.Rows;
IEnumerable<DataRow> idr = drc.Cast<DataRow>();
var result = idr.Select(dr => GetDataFromDataRow(dr)).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.