【问题标题】:Trying to convert list into array yields "error CS1503: Argument 1: cannot convert from 'System.Collections.Generic.List<int>' to 'System.Array' "尝试将列表转换为数组会产生“错误 CS1503:参数 1:无法从 'System.Collections.Generic.List<int>' 转换为 'System.Array'”
【发布时间】:2020-02-25 10:11:06
【问题描述】:

我是来自 python 背景的 C# 新手。我目前正试图在 codewars.com 上解决这个challenge。这是关于找到一个数字的所有除数。我尝试用以下方式编程,这已经是我在question中的代码的改进版本@

using System;
using System.Collections.Generic;

public class Kata
{  
  public static int[] Divisors(int n)
  {
    List<int> divisors = new List<int>();

    int i = 2, biggest_divisor = n;

    while (true)
    {
      if ( n % i == 0)
        {
          divisors.Add(i);
          divisors.Add(n/i);
          biggest_divisor = i;
        }

      if ( i > biggest_divisor)
        break;

      i++;
    }

    if (divisors.Count > 0)
    {
      divisors.ToArray();
      return Array.Sort(divisors);
    }
    else
      return null;
  }
}

执行if (divisors.Count &gt; 0) 时会产生以下错误

错误 CS1503:参数 1:无法从 'System.Collections.Generic.List' 转换为 'System.Array'

为什么还是会出现这个错误,我只是在使用列表中的方法。

【问题讨论】:

  • divisors.ToArray 不会将当前列表转换为数组(这意味着实例可以更改其运行时类型),但它会创建一个新数组,方法会返回。所以你应该将ToArray 的返回值分配给一个变量并在Sort 中使用它。
  • 不要为集合类型(数组、列表等)返回null。而是返回一个空集。然后您可以删除&gt; 0 检查,因为您不必根据是否有任何项目做任何不同的事情。

标签: c# arrays list error-handling


【解决方案1】:

嗯,

  divisors.ToArray(); 

创建一个新 int[] 数组并将其丢弃。然后你尝试将 list divisors (List&lt;int&gt;) 排序为 array:

  // divisors is List<int>, not expected int[] 
  return Array.Sort(divisors);

并有编译时错误。让我们对divisors 进行排序并一次性将其作为数组返回:

using System.Linq;

...

public static int[] Divisors(int n)
  {
    ...
    if (divisors.Count > 0)
    {
      // Order List, create an array from it and, finally, return the array
      return divisors.OrderBy(item => item).ToArray();
    }
    else
      //TODO: better return an empty array: return int[0]; 
      return null;
  }

【讨论】:

  • 我需要在public static之前添加一些东西吗?此代码产生以下错误
  • 错误 CS1061: 'List' 不包含 'OrderBy' 的定义,并且没有可访问的扩展方法 'OrderBy' 接受类型为 'List' 的第一个参数(您是否缺少 using 指令或程序集引用?)
  • 在顶部添加using System.Linq;
【解决方案2】:

将divisors.ToArray(); 传递给Array.Sort(HERE); 它期待Array 而不是List&lt;T&gt;

divisors.ToArray() 不会改变divisors,而是返回转换为Array 结构的列表副本。

所以:

if (divisors.Count > 0)
{
  divisors.ToArray();
  return Array.Sort(divisors);
}

应该是

if (divisors.Count > 0)
{
  var divisorsArray = divisors.ToArray();
  Array.Sort(divisorsArray);
  return divisorsArray;
}

错误应该消失了

顺便说一句,使用 do-while 代替 While(true) 和 break。

【讨论】:

  • 我认为您的意思是将if 语句的部分更改为`return Array.Sort(divisors.ToArray());. This however yields error CS0029: 无法将类型'void'隐式转换为' int[]'`
  • 这是不对的。 Array.sort() 将返回 void 但他的方法需要 int 数组
  • 好吧,没关系,在您编辑之前发表了评论。我提到的错误仍然存​​在
  • 这就是我在Array.Sort @madreflection 之后返回divisorsArray 的原因
  • 我必须了解每个方法公司吗?我不这么认为,你在记事本上编写c#代码吗?如果我必须了解所有公司,那么使用强类型语言有什么意义。来吧。
【解决方案3】:

问题是 ToArray() 方法返回一个数组,而不是转换数组中的对象。

要解决这个问题,您必须执行以下操作:

    if (divisors.Count > 0)
    {
      var divs = divisors.OrderBy().ToArray();
      return divs;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多