使用Cast <t>?</t>将int []转换为double []

时间:2012-03-20 21:42:44

标签: c# .net linq ienumerable

  

可能重复:
  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;为什么它在这个看起来如此明显的例子中不起作用。

2 个答案:

答案 0 :(得分:4)

Cast用于将IEnumerable(无类型)转换为IEnumerable<T>(通常键入)。它实际上不会对任何成员进行不同的演绎。

this answer

  

嗯,你对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并装箱源中的每个元素。然后它会尝试取消装箱,此时你会爆炸。