为什么我看到 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
.
你有两个问题。
int
可以直接投向 string
(在不能)#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
在这个过程中。
需要注意的是,即使有一个。implicit
或 explicit
改用 int
到 string
,即 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();