2010-03-24 12 views
24

Sto creando un'applicazione in C#. La sua funzione è valutare se un dato è primo e se lo stesso numero scambiato è primo pure.Errore: "è necessario un riferimento a un oggetto per il campo, il metodo o la proprietà non statici ..."

Quando si crea la soluzione in Visual Studio, si dice che "è necessario un riferimento a un oggetto per il campo, il metodo o la proprietà non statici ...". Sto avendo questo problema con i metodi "volteado" e "siprimo".

Dove è il problema e come posso risolvere il problema?

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; 
     } 
    } 
} 
+2

Benvenuti in StackOverflow! Per favore usa più nomi di domande descrittivi in ​​futuro :) – Matchu

+0

Modifica la tua domanda per la formattazione. Le prime righe del tuo codice non sono coperte dal formato del codice. –

+3

Crea formattazione pertinente, modifica del titolo :) – Matchu

risposta

51

Non è possibile accedere ai membri non statici da un metodo statico. (Notare che Main() è statico, che è un requisito di .Net). Basta fare siprimo e volteado statico, ponendo la parola chiave statica di fronte a loro. es .:

static private long volteado(long a) 
+0

problema risolto! grazie :) – user300484

+0

@ user300484 dovresti contrassegnare questa risposta come corretta facendo clic sul segno di spunta sotto la valutazione. – mxmissile

+3

La vera risposta a questa domanda è fornita da shazia, questa è una soluzione senza senso di programmazione –

3

Cambia i tuoi firme per siprimo bool private static (lunga a) e lunga volteado private static (lunga a) e vedere dove che si ottiene.

18

Basta aggiungere static nella dichiarazione di questi due metodi e l'errore di tempo di compilazione scompare!

Per impostazione predefinita in C# metodi sono metodi di istanza, e ricevono l'argomento implicito "sé". Rendendoli statici, non è necessario alcun argomento (né disponibile) e il metodo deve ovviamente astenersi dall'accedere a qualsiasi istanza (non statici) oggetti o metodi della classe.

Maggiori informazioni sui metodi statici
Purché la classe e modificatori di accesso del metodo (pubblico contro privato) sono ok, un metodo statico può quindi essere chiamato da qualsiasi luogo, senza dover preventivamente un'istanza di un'istanza della classe. In altre parole metodi statici vengono utilizzati con la seguente sintassi:

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

Un classico esempio di metodi statici si trovano nella classe System.Math, per cui possiamo chiamare un mazzo di questi metodi come

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

senza mai istanziare una classe "matematica" (in realtà non so nemmeno se tale istanza è possibile)

+3

+1 per dare un'idea del problema piuttosto che una semplice soluzione: questo è molto più utile per un nuovo arrivato a C# che è ancora imparare le basi. Ho due commenti collaterali, tuttavia: 1) Math è una classe statica (http://msdn.microsoft.com/en-us/library/system.math.aspx) quindi il tuo sospetto è giusto: non può essere istanziato ; e 2) forse dovresti fornire qualche esempio di metodi di istanza ... viene in mente l'onnipresente ToString(). –

0

Hai solo bisogno di rendere statici i metodi siprimo e volteado.

private static bool siprimo(long a) 

e

private static long volteado(long a) 
0

Il messaggio di errore significa che è necessario richiamare volteado e siprimo su un'istanza della classe Program. Es .:

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

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

Non possono essere richiamati direttamente dal metodo Main perché Main è statico mentre volteado e siprimo non lo sono.

Il modo più semplice per risolvere questo problema è quello di rendere i volteado e siprimo metodi statici:

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

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

Creare una classe e mettere tutto il codice in là e chiamare un'istanza di questa classe dalla principale:

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 

} 
+5

Questa è la vera soluzione a questo problema –

+0

Sì, a lungo termine e come buona pratica dovresti incapsularlo su una classe. – Patricio

Problemi correlati