数组设置在启动时抛出错误 - CS0021错误(C#)

时间:2017-11-11 16:24:08

标签: c# arrays

我想通过创建一个允许用户输入数组所具有的元素的小程序来练习制作数组,然后使用用户输入的元素数量创建一个数组,并用数字填充所有元素。例如:如果输入3,它将生成3个元素,填充元素1的编号为1,编号2编号为2,依此类推。虽然每次都会出现特定错误:CS0021无法将[]索引应用于“方法组”类型的表达式 这是我的代码:

       static void Main(string[] args)
    {
        int num;
        string getNum;
        getNum = Console.ReadLine();
        num = Int32.Parse(getNum);
        int[] array = new int[num];
        Console.WriteLine("Array created with {0} elements.",num);
    }
    static void Array(int input)
    {
        int num = 1;
        int inum = input;
        while(inum >= input)
        {
            Array[inum] = num;
            Console.WriteLine("{0}",input);
            Console.WriteLine("{0}", num);
            inum = inum - 1;
            num = num + 1;
        }

如果您决定帮助我,请提前致谢:)

2 个答案:

答案 0 :(得分:0)

在您的prgoram中Array是一种方法。

因此,Array[inum] = num行是错误的,因为Array是一种方法,并且您无法将索引器([])应用于方法。

实现您想要的最快捷方式如下:

static int[] Array(int input) // Change return type to return an array of integers
{
    var result = new int[input]; // Declare a local variable to hold a new array of size input.

    // Change while to basic for loop
    for (int i = 0; i < input; i++)
    {
        result[inum] = i + 1; // set elements of the result array.
        Console.WriteLine("{0}",input);
        Console.WriteLine("{0}", i);
    }
}

在您的主要方法中:

static void Main(string[] args)
{
    int num;
    string getNum;
    getNum = Console.ReadLine();
    num = Int32.Parse(getNum);
    int[] array = Array(num); // Change this to call the Arrra(int num) method
    Console.WriteLine("Array created with {0} elements.",num);
}

或者您可以使用简单的Linq语句:

Enumerable.Range(1, input).ToArray();

答案 1 :(得分:0)

好的,让我们整理一下你的代码,然后尝试让它做你想做的事情:

让我们首先从您Main方法中获取任何逻辑,然后编写特定的方法,以实现您的目标。记住,你制作方法越小,就越难找到写错误的方法。如果你正在学习,那就开始变得荒谬,并且在你获得自信的情况下变得更大。

好的,有一个向用户询问数字的概念,让我们编写一个执行此操作的方法,并在此过程中使其尽可能健壮。请记住,用户是愚蠢的!询问一个号码,他们会输入任何内容,但是:

public static int PromptUserForPositiveInteger(string prompt)
{
    int number;
    Console.Write(prompt);
    var input = Console.ReadLine();

    while (!int.TryParse(input, out number) ||
             number < 0)
    {
        Console.Write("Input is not a valid number, try again: ");
        input = Console.ReadLine();
    }

    return number;
}

好的,所以这个方法的作用是询问用户一个正整数,并且它会继续这样做,直到用户设法输入一个有效的数字或拉动插件。无论哪种方式,我们都很安全。 int.TryParse是一种从int中提取string的安全方式;如果可以这样做,它会给你一个数字并返回true,否则它将返回false。如果它失败了,你不会做的就是在你的脸上爆炸,int.Parse很乐意这样做。避免Parse像瘟疫一样,总是使用frendlier TryParse

另外值得一提的是,此方法是实现细节,因此其private。班上没有人需要使用它,所以不要显示它。

另请注意,我们可以对此进行概括,使调用者指定您要如何提示用户。你没有理由想要将这种方法仅限于数组大小,也许明天你需要你要喂猴子的香蕉数量!每当它便宜又容易,概括你的代码。每当概括很难,不要,你很可能不需要它和浪费精力。

现在,我们需要的下一个任务是创建一个int数组并用值填充它。该值将是每个数组元素的索引。哦,等等,我们说无论多么荒谬,我们都会为每个任务制定一个方法!是的,我知道,但荒谬的小只是到目前为止。

private static int[] CreatArrayAndSetValuesToIndex(int size)
{
    Debug.Assert(size >= 0);
    var array = new int[size];

    for (var i = 0; i < size; i++)
    {
        array[i] = i;
    }

    return array;
}

CreatArrayAndSetValuesToIndex似乎是一个荒谬的长名称,但它会告诉你该方法的确切内容。习惯使用描述性名称并避免使用缩写。使用intellisense的现在,使用简短的神秘名称毫无意义。

还要注意参数验证。我永远不会强调这一点:始终验证方法的输入!。如果事情在某些条件下不起作用,请确保尽一切可能避免这些情况。由于该方法是私有的,Debug.Assert就足够了。如果它是公共表面的一部分,你需要抛出一个适当的例外(ArgumentOutOfRange作为一个恰当的例子。)

最后但并非最不重要的是,让我们自己写一个打印出int数组的方法,这样我们就可以确保我们的代码运行良好:

private static void PrintOut(int[] array)
{
    Console.WriteLine(string.Join(Environment.NewLine, array);
}

我已经利用了框架中已有的工具。 string.Join是一个漂亮的小方法,它接受任何可枚举的对象(数组就是其中之一),并使用给定的分隔符(在本例中为新行)创建其所有成员的字符串。

现在,剩下的就是将它们放在一起:

static void Main(string[] args)
{
    var size = PromptUserForPositiveInteger("Enter array size: ");
    var array = CreatArrayAndSetValuesToIndex(size);
    PrintOutArray(array);
    Console.ReadLine();
}

我们已经完成了!