为什么Enumerable.Cast会引发InvalidCastException?

时间:2010-05-03 19:57:12

标签: c# casting ienumerable

如果我可以隐式地将整数值转换为double,例如:

int a = 4;    
double b = a;
// now b holds 4.0

为什么我不能这样做:

int[] intNumbers = {10, 6, 1, 9};    
double[] doubleNumbers2 = intNumbers.Cast<double>().ToArray();

我收到“指定演员无效”InvalidCastException例外。

相反(从double转换为int)会导致相同的错误。

我做错了什么?

2 个答案:

答案 0 :(得分:55)

嗯,你对Cast的期望不正确,这就是全部 - 这意味着要处理装箱/拆箱,参考和身份转换,这就是全部。遗憾的是,文档并不像它可能那样清晰:(

解决方案是使用Select

doubleNumbers2 = intNumbers.Select(x => (double) x).ToArray();

答案 1 :(得分:8)

要添加到Jon的答案,对于实现IEnumerable但没有其他内容的对象主要有用。以XmlNodeList为例。如果您没有使用System.Xml.Linq命名空间,可以使用Cast<XmlElement>编写一些不错的LINQ查询。

var result = xmlNodeList
    .Cast<XmlElement>()
    .Select(e=> e.GetAttribute("A") + e.GetAttribute("B"))
    .ToArray();