2010-03-24 10 views
24

Ich erstelle eine Anwendung in C#. Seine Funktion besteht darin, zu bewerten, ob ein gegebenes Primzahl ist und ob die gleiche vertauschte Zahl ebenfalls Prim ist.Fehler: "Für das nicht statische Feld, die Methode oder die Eigenschaft wird eine Objektreferenz benötigt ..."

Wenn ich meine Lösung in Visual Studio erstellen, heißt es, dass "eine Objektreferenz für das nicht statische Feld, Methode oder Eigenschaft ... erforderlich ist". Ich habe dieses Problem mit den Methoden "volteado" und "siprimo".

Wo ist das Problem und wie kann ich es beheben?

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

Willkommen bei StackOverflow! Bitte verwenden Sie in Zukunft mehr beschreibende Frage-Namen :) – Matchu

+0

Bitte bearbeiten Sie Ihre Frage zur Formatierung. Die ersten Zeilen Ihres Codes sind nicht im Codeformat enthalten. –

+3

Gemachte relevante Formatierung, Titeländerungen :) – Matchu

Antwort

51

Sie können nicht von einer statischen Methode auf nicht statische Elemente zugreifen. (Beachten Sie, dass Main() statisch ist, was eine Anforderung von .Net ist). Machen Sie siphimo und volteado statisch, indem Sie das statische Schlüsselwort vor sie setzen. z.B .:

static private long volteado(long a) 
+0

Problem gelöst! danke :) – user300484

+0

@ user300484 Sie sollten diese Antwort als richtig markieren, indem Sie auf den Haken unter der Bewertung klicken. – mxmissile

+3

Die wirkliche Antwort auf diese Frage wird von Shazia gegeben, das ist ein Workaround ohne Programmiersinn –

3

Ändern Sie Ihre Signaturen private static bool siprimo (long a) und private static lange volteado (long a) und sehen, wohin man bekommt.

18

einfach static in der Erklärung dieser beiden Methoden und die Kompilierung Fehler verschwinden hinzuzufügen!

standardmäßig in C# Methoden sind Instanzmethoden, und sie erhalten die impliziten "self" -Argument. Wenn sie statisch gemacht werden, wird kein solches Argument benötigt (noch ist es verfügbar), und die Methode muss dann natürlich davon absehen, auf beliebige (nicht statische) Instanzobjekte oder Methoden der Klasse zuzugreifen.

Weitere Informationen über statische Methoden
die Klasse bereitgestellt, und die Zugriffsmodifikatoren Methode (public vs. privat) sind in Ordnung, eine statische Methode kann dann von überall aufgerufen werden, ohne vorher mit einer Instanz der Klasse instanziiert. Mit anderen Worten: statische Methoden werden mit der folgenden Syntax:

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

Ein klassisches Beispiel für statische Methoden in der Klasse System.Math gefunden werden, wobei wir eine Reihe dieser Methoden wie

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

ohne jemals eine "Math" -Klasse zu instanziieren (in der Tat weiß ich nicht einmal, ob solch eine Instanz möglich ist)

+3

+1 für den Einblick in das Problem, anstatt nur eine Quick-Fix: das ist viel sinnvoller für einen Neuling in C#, die immer noch ist die Grundlagen lernen. Ich habe jedoch zwei Nebenkommentare: 1) Math ist eine statische Klasse (http://msdn.microsoft.com/en-us/library/system.math.aspx), also ist Ihr Verdacht richtig: Es kann nicht instanziiert werden ; und 2) vielleicht sollten Sie ein Beispiel für Instanzmethoden angeben ... der allgegenwärtige ToString() kommt mir in den Sinn. –

0

Sie müssen nur die siprimo und volteado Methoden statisch machen.

private static bool siprimo(long a) 

und

private static long volteado(long a) 
0

Die Fehlermeldung bedeutet, dass Sie volteado und siprimo auf eine Instanz der Klasse Program aufrufen müssen. Z.B .:

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

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

Sie können nicht direkt von der Main Methode aufgerufen werden, da Main statisch ist, während volteado und siprimo nicht sind.

Der einfachste Weg, dies zu beheben, ist die volteado und siprimo Methoden statisch zu machen:

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

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

Erstellen Sie eine Klasse und Ihr Code alle in dort setzen und eine Instanz dieser Klasse von der Haupt nennen:

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

Dies ist die echte Lösung für dieses Problem –

+0

Ja, auf lange Sicht und als gute Praxis sollten Sie es in einer Klasse kapseln. – Patricio

Verwandte Themen