3

我收到带有以下代码的以下错误消息。我认为数据类型与 C#List<double>相同,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;
4

4 回答 4

3

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

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

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

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

nbtemp.AddRange(crv[i].DivideByLength(nb, true));
于 2012-11-09T15:43:30.857 回答
1

您正在使用分配,并且很难说出 DivideByLength 返回的内容,如果是单个值,则使用:

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

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

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

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

  • 列表
  • 大批

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

  • 于 2012-11-09T15:41:18.460 回答
    1

    您无法从 Array 转换为 List,但您可以轻松调用:

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

    或者,由于您已经定义了列表,您还可以:

    nbtemp.AddRange(crv[i].DivideByLength(nb, true));
    
    于 2012-11-09T15:41:22.167 回答
    0

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

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

    或者

    nbtemp.AddRange(crv[i].DivideByLength(nb, true));
    
    于 2012-11-09T15:43:38.397 回答