【问题标题】:Convert int[] to double[] using Cast<T>? [duplicate]使用 Cast<T> 将 int[] 转换为 double[]? [复制]
【发布时间】:2012-03-20 21:42:44
【问题描述】:

可能重复:
IEnumerable.Cast<>

可以隐式地从 int 转换为 double。 为什么“指定的演员表无效”。此处引发异常?

 double[] a = Enumerable.Range(0, 7).Cast<double>().ToArray();

我已经尝试了它的几个“版本”。

附:我知道可能的解决方案,例如:

 double[] a = Enumerable.Range(0, 7).Select(x => (double)x).ToArray();

但我很好奇 Cast 是如何工作的 => 为什么它在这个看起来如此明显的示例中不起作用。

【问题讨论】:

    标签: c# .net linq ienumerable


    【解决方案1】:

    Cast 用于将 IEnumerable(无类型)转换为 IEnumerable&lt;T&gt;(一般类型)。它实际上不会改变任何成员。

    this answer:

    好吧,您对 Cast 的期望不正确,仅此而已 - 意思是 处理装箱/拆箱、引用和身份转换,以及 就这样。不幸的是,文档并不像 可能是

    所以,你被 .Select() 困住了。

    【讨论】:

    • 鉴于此,“演员”int x = 42; double d = (double)x; 是如何工作的?
    • 将这个问题作为副本关闭而不是从您链接到的问题中提供已接受的答案不是更合适吗?
    • +1 顺便说一句:Select 比 Cast 快,多次测试。
    • @pst:这样的强制转换实际上被编译为“转换”指令。正如 BFree 指出的那样,当您拆箱时,系统并不知道要执行此转换。
    【解决方案2】:

    失败的原因是因为本质上你正在这样做:

            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 并将源中的每个元素装箱。然后它会尝试在您爆炸的时候拆箱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多