Вопрос о ссылке на объект C #

#c#

#c#

Вопрос:

Я создаю действительно базовую программу, в которой есть метод для заполнения массива, но я получаю ошибку, которую я не понимаю. Я программист на Java, пытающийся освоиться с C # и .NET. Любая помощь была бы отличной.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;

namespace TestThreads
{
    class Program
    {
        static void Main(string[] args)
        {
             int[]  empty = new int[50001];
             int[] filled = new int[50001];

            filled = compute(empty); //error occurs here

            Console.ReadLine();
        }

        public int[] compute(int[] inArray)
        {
            for (int i = 0; i < inArray.Length; i  )
            {
                inArray[i] = i << 2;
            }

            return inArray;
        }
    }
}
  

Сообщение об ошибке:

Ошибка 1 Для тестовых потоков нестатического поля, метода или свойства требуется ссылка на объект.Program.compute(int[])’ C:Usershunter.mcmillenDesktopTestProcessSplittingTestProcessSplittingProgram.cs 17 22 Тестовые потоки

Спасибо, Хантер

Комментарии:

1. В этом случае Java выдаст вам аналогичную ошибку … вы пытаетесь вызвать метод экземпляра, как если бы он был статическим.

2. правильно, но компилятор Java выдает мне это сообщение: нестатический метод compute (int[]) не может ссылаться из статического контекста, который я действительно могу понять.

Ответ №1:

Метод вычисления должен быть статическим.

 public static int[] compute(int[] inArray)
  

Ответ №2:

Вы пытаетесь вызвать, compute который является методом экземпляра, из Main который является static методом. Чтобы исправить это, также сделайте compute статичным`

 public static int[] compute(int[] inArray) 
  

Ответ №3:

Main это статический метод — он не специфичен для какого-либо отдельного объекта — действительно, ни один экземпляр Program не создается для вызова Main . compute является методом экземпляра и должен вызываться для одного объекта.

Два варианта:

  1. сделайте compute статическим, что имеет смысл, поскольку оно не использует состояние (поля):

     public static int[] compute(int[] inArray) {...}
      
  2. создайте экземпляр в Main :

     var obj = new Program();
    filled = obj.compute(empty); 
      

Первый вариант здесь более привлекателен. Я включил второй исключительно для полноты картины.

Ответ №4:

Изменение public int[] compute(int[] inArray){...}

Для

public static int[] compute(int[] inArray){..}

или измените свой вызов с

 filled = compute(empty); 
  

Для

 filled = new Program().compute(empty); 
  

compute() Используемый вами метод является экземплярным (нестатическим) методом и требует вызова экземпляра.

Ответ №5:

Добавьте статику в объявление метода вычисления.

 public static int[] compute(int[] inArray)
  

Ответ №6:

Ваш метод не является статическим, на него ссылаются из статического метода. Измените его на статический. Решен.

 public static int[] compute(int[] inArray) { ... }