Подтвердить что ты не робот

Ошибка: "ссылка на объект требуется для нестатического поля, метода или свойства..."

Я создаю приложение на С#. Его функция состоит в том, чтобы оценить, является ли заданное простым и если одно и то же число подкачки является простым.

Когда я создаю свое решение в Visual Studio, он говорит, что "ссылка на объект требуется для нестатического поля, метода или свойства...". У меня возникла проблема с методами "volteado" и "siprimo".

Где проблема и как ее исправить?

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Write a number: ");
            long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user


            long av = volteado(a); // av is "a" but swapped

            if (siprimo(a) == false && siprimo(av) == false)
                Console.WriteLine("Both original and swapped numbers are prime.");
            else
                Console.WriteLine("One of the numbers isnt prime.");
            Console.ReadLine();
        }

        private bool siprimo(long a)
        {
            // Evaluate if the received number is prime
            bool sp = true;
            for (long k = 2; k <= a / 2; k++)
                if (a % k == 0) sp = false;
            return sp;
        }

        private long volteado(long a)
        {
            // Swap the received number
            long v = 0;
            while (a > 0)
            {
                v = 10 * v + a % 10;
                a /= 10;
            }
            return v;
        }
    }
}
4b9b3361

Ответ 1

Вы не можете получить доступ к нестационарным элементам из статического метода. (Обратите внимание, что Main() является статическим, что является требованием .Net). Просто сделайте siprimo и volteado static, поставив перед ними статическое ключевое слово. например:.

 static private long volteado(long a)

Ответ 2

Создайте класс и поместите весь свой код туда и вызовите экземпляр этого класса из Main:

static void Main(string[] args)
{

    MyClass cls  = new MyClass();
    Console.Write("Write a number: ");
    long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user
    long av = cls.volteado(a);
    bool isTrue = cls.siprimo(a);
    ......etc

}

Ответ 3

Просто добавьте static в объявление этих двух методов, и ошибка времени компиляции исчезнет!

По умолчанию в методах С# методы экземпляра, и они получают неявный аргумент "self". Ставя их статическими, такой аргумент не нужен (и не доступен), и поэтому метод должен, конечно, воздерживаться от доступа к каким-либо экземплярам (нестатическим) объектам или методам класса.

Дополнительная информация о статических методах
При условии, что модификаторы доступа к классу и методу (public vs. private) в порядке, статический метод может быть вызван из любого места без необходимости экземпляра экземпляра класса раньше. Другими словами, статические методы используются со следующим синтаксисом:

    className.classMethod(arguments)
rather than
    someInstanceVariable.classMethod(arguments)

Классический пример статических методов содержится в классе System.Math, посредством чего мы можем назвать кучу таких методов, как

   Math.Sqrt(2)
   Math.Cos(Math.PI)

без создания экземпляра класса "Math" (на самом деле я даже не знаю, возможен ли такой экземпляр)

Ответ 4

Измените свои подписи на частные статические bool siprimo (long a) и частные статические long volteado (long a) и посмотрите, где это вам.

Ответ 5

Вам просто нужно сделать методы siprimo и volteado static.

private static bool siprimo(long a)

и

private static long volteado(long a)

Ответ 6

Сообщение об ошибке означает, что вам нужно вызвать volteado и siprimo в экземпляре класса Program. Например:.

...
Program p = new Program();
long av = p.volteado(a); // av is "a" but swapped

if (p.siprimo(a) == false && p.siprimo(av) == false)
...

Они не могут быть вызваны непосредственно из метода Main, потому что Main является статическим, а volteado и siprimo - нет.

Самый простой способ исправить это - сделать статические методы volteado и siprimo:

private static bool siprimo(long a)
{
    ...
}

private static bool volteado(long a)
{
   ...
}