Ошибка: "ссылка на объект требуется для нестатического поля, метода или свойства..."
Я создаю приложение на С#. Его функция состоит в том, чтобы оценить, является ли заданное простым и если одно и то же число подкачки является простым.
Когда я создаю свое решение в 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;
}
}
}
Ответы
Ответ 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)
{
...
}