无法将类型`double[]`隐式转换为`System.Collections.Generic.List<double>`。

3

以下是我的代码,我遇到了下面的错误信息。我以为数据类型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;

拥有两个引用同一列表对象的 List<double> 变量的目的是什么? - cdhowie
@cdhowie,我以为这样会更清楚,难道不是吗? - Arthur Mamou-Mani
这真的不太清晰。为什么需要两个相同类型的本地变量来引用同一个对象,这很令人困惑。 - cdhowie
List<type>是一种通用集合,而double[]是特定类型double的对象数组,为什么要混合使用这两者呢?这两者并不相同,甚至没有任何关系,其中一个直到.NET Framework 2.0才出现。 - Security Hound
4个回答

3
不,列表并不是数组,尽管它们的概念有些相似。C#中的List<T>类实际上是通过幕后的数组来实现的。
如果你想从一个数组中设置一个列表,你可以使用以下代码:
nbtemp = new List<double>(crv[i].DivideByLength(nb, true));

这将创建一个新的列表,并用数组初始化它。如果您想要将数组附加到现有列表中,也可以使用ListAddRange方法,像这样:

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

1

您正在使用一项任务,很难确定DivideByLength返回什么,如果是单个值,请使用:

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

否则,如果它返回一个数组,请尝试更改您的定义以允许列表包含数组:
List<double[]> nbtemp = new List<double[]>();

请注意,Listdouble[]不等同。 List具有许多简单数组没有的功能。您可以通过查看两个不同的MSDN文章中公开公开的方法来了解差异。
  • List
  • Array
  • 此外,您的for循环目前正在使用赋值。如果不更改代码的这部分,则只会将for循环的最后一次迭代分配给变量nbtemp(假设您删除错误)。

    1

    你不能将数组转换为列表,但你可以轻松地调用:

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

    或者,既然您已经定义了两个列表,您也可以这样做:

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

    @JoelEtherton - 必须喜欢点击的竞赛。 :-) - Justin Niessner

    0

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

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

    或者

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接