【问题标题】:Cannot implicitily convert type `double[]` to `System.Collections.Generic.List<double>`无法将类型 `double[]` 隐式转换为 `System.Collections.Generic.List<double>`
【发布时间】:2012-11-09 15:39:52
【问题描述】:

我收到以下错误消息,代码如下。我认为数据类型 List&lt;double&gt;double[] 相同,但 C# 要求使用第一种语法对其进行实例化,以便变量作为对象工作。我做错了什么还是我的想法错了?

Cannot implicitily convert type `double[]` to `System.Collections.Generic.List<double>`

代码:

private void RunScript(List<Curve> crv, double nb, ref object DivPts)
  {

    List<double> nbtemp = new List<double>();
    List<double> Divpt = new List<double>();

    for(int i = 0; i < crv.Count;i = i + 2)
    {
      nbtemp = crv[i].DivideByLength(nb, true);
    }

    Divpt = nbtemp;

【问题讨论】:

  • 拥有两个引用同一个列表对象的List&lt;double&gt;变量的目的是什么?
  • @cdhowie,我以为会更清楚,不是吗?
  • 真的不太清楚。为什么需要两个具有相同类型的本地人来引用同一个对象,这令人困惑。
  • A List 是一个泛型集合 a double[] 是一个特定类型的对象数组 double 你为什么要混合这两者?两者并不相同,甚至不相近,甚至在 .NET Framework 2.0 之前都不存在一个

标签: c# syntax for-loop double


【解决方案1】:

不,列表不是数组,尽管概念有些相似。 C# 中的List&lt;T&gt; 类实际上是用一个幕后数组实现的。

如果你想从一个数组中设置一个 List,你可以使用这样的东西:

nbtemp = new List<double>(crv[i].DivideByLength(nb, true));

这将创建一个新列表,并使用数组对其进行初始化。如果您想将数组附加到现有列表,还可以使用ListAddRange 方法,如下所示:

nbtemp.AddRange(crv[i].DivideByLength(nb, true));

【讨论】:

    【解决方案2】:

    不能从Array转List,但是可以很方便的调用:

    nbtemp = crv[i].DivideByLength(nb, true).ToList();
    

    或者,既然您已经定义了列表,您还可以:

    nbtemp.AddRange(crv[i].DivideByLength(nb, true));
    

    【讨论】:

    • @JoelEtherton - 一定会喜欢点击比赛。 :-)
    【解决方案3】:

    您正在使用赋值,很难判断 DivideByLength 返回什么,如果是单个值,则使用:

    nbtemp.Add(crv[i].DivideByLength(nb, true));
    

    否则,如果它返回一个数组,请尝试更改您的定义以允许列表包含数组:

    List<double[]> nbtemp = new List<double[]>();
    

    请注意,List 不等同于 double[]List 具有许多简单数组所没有的特性。您可以通过查看公开公开方法的两篇不同的 MSDN 文章来了解差异。

  • List
  • Array

    此外,您的 for 循环目前正在使用赋值。如果不更改该部分代码,您只会将 for 循环的最后一次迭代分配给变量 nbtemp(假设您删除了错误)

  • 【讨论】:

      【解决方案4】:

      它们都是IEnumerable 的实现者,但它们不是等价的类型。您将需要执行强制转换或方法调用。在上面的代码中,我会说你需要:

      nbtemp = (crv[i].DivideByLength(nb, true)).ToList();
      

      nbtemp.AddRange(crv[i].DivideByLength(nb, true));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 2019-08-18
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多