Error: “se requiere una referencia de objeto para el campo, método o propiedad no estáticos …”

Estoy creando una aplicación en C #. Su función es evaluar si un dado es primo y si el mismo número intercambiado también es primo.

Cuando construyo mi solución en Visual Studio, dice que “se requiere una referencia de objeto para el campo, método o propiedad no estáticos …”. Tengo este problema con los métodos “volteado” y “siprimo”.

¿Dónde está el problema y cómo puedo solucionarlo?

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  0) { v = 10 * v + a % 10; a /= 10; } return v; } } } 

No puede acceder a miembros no estáticos desde un método estático. (Tenga en cuenta que Main() es estático, que es un requisito de .Net). Simplemente haga que siprimo y volteado estén estáticos, colocando la palabra clave estática frente a ellos. p.ej:

  static private long volteado(long a) 

Cree una clase y coloque todo su código allí y llame a una instancia de esta clase desde 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 } 

¡Simplemente agregue static en la statement de estos dos métodos y el error de tiempo de comstackción desaparecerá!

Por defecto en C # los métodos son métodos de instancia , y reciben el argumento “self” implícito. Al hacerlos estáticos, no se necesita ningún argumento (ni está disponible), y el método debe abstenerse, por supuesto, de acceder a cualquier objeto o método de instancia (no estático) de la clase.

Más información sobre métodos estáticos
Siempre que la clase y los modificadores de acceso del método (público frente a privado) estén bien, se puede llamar a un método estático desde cualquier lugar sin tener que instanciar previamente una instancia de la clase. En otras palabras, los métodos estáticos se utilizan con la siguiente syntax:

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

Un ejemplo clásico de métodos estáticos se encuentra en la clase System.Math, por lo que podemos llamar a un montón de estos métodos, como

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

sin instanciar una clase de “Matemáticas” (de hecho, ni siquiera sé si tal instancia es posible)

Cambia tus firmas a bool siprimo estático privado (long a) y volteado largo estático privado (long a) y mira a dónde te lleva eso.

Solo necesitas hacer que los métodos siprimo y volteado sean estáticos.

 private static bool siprimo(long a) 

y

 private static long volteado(long a) 

El mensaje de error significa que debe invocar volteado y siprimo en una instancia de la clase Program . P.ej:

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

No se pueden invocar directamente desde el método Main porque Main es estático mientras que volteado y siprimo no lo son.

La forma más fácil de solucionar esto es hacer que los métodos volteado y siprimo estáticos:

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