可能重复:
IEnumerable.Cast<>
可以隐式地从int转换为double。 为什么“指定演员表无效”。在这里引发了异常?
double[] a = Enumerable.Range(0, 7).Cast<double>().ToArray();
我已经尝试了几个“版本”。
P.S。我知道可能的解决方案,如:
double[] a = Enumerable.Range(0, 7).Select(x => (double)x).ToArray();
但我很好奇Cast的工作方式=&gt;为什么它在这个看起来如此明显的例子中不起作用。
答案 0 :(得分:4)
Cast
用于将IEnumerable
(无类型)转换为IEnumerable<T>
(通常键入)。它实际上不会对任何成员进行不同的演绎。
嗯,你对Cast有不正确的期望,这就是全部 - 这意味着 处理装箱/拆箱,参考和身份转换,以及 就这样。不幸的是,文档并不那么清楚 它可能是
所以,你坚持使用.Select()
。
答案 1 :(得分:4)
失败的原因是因为基本上你这样做了:
int x = 10;
object f = x;
double d = (double) f;
int被装入对象,当你去取消它时,你试图将它取消装箱为双。
更具体地说,这是Cast的实现:
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
{
IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
if (enumerable != null)
{
return enumerable;
}
if (source == null)
{
throw Error.ArgumentNull("source");
}
return Enumerable.CastIterator<TResult>(source);
}
private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (object current in source)
{
yield return (TResult)current;
}
yield break;
}
正如您所看到的,它循环遍历IEnumerable并装箱源中的每个元素。然后它会尝试取消装箱,此时你会爆炸。