2010-03-24 83 views
24

我在C#中創建應用程序。它的功能是評估給定是否爲素數,以及是否相同的交換數字也是素數。錯誤:「非靜態字段,方法或屬性需要對象引用...」

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

歡迎來到StackOverflow!請在將來使用更多的描述性問題名稱:) – Matchu 2010-03-24 03:38:40

+0

請編輯您的問題進行格式化。您的代碼的前幾行不包含在代碼格式中。 – 2010-03-24 03:38:55

+3

作出相關格式化,標題編輯:) – Matchu 2010-03-24 03:39:44

回答

51

您無法從靜態方法訪問非靜態成員。 (請注意,Main()是靜態的,這是.Net的要求)。只需將靜態關鍵字放在它們的前面,就可以使siprimo和volteado成爲靜態。例如:

static private long volteado(long a) 
+0

問題解決了!謝謝:) – user300484 2010-03-24 03:51:50

+0

@ user300484你應該點擊評級下面的檢查標記這個答案是正確的。 – mxmissile 2010-03-24 03:55:07

+3

這個問題的真正答案是由shazia提供的,這是一個沒有編程意義的解決方法 – 2012-08-29 14:15:49

3

改變你的簽名,以私人靜態布爾siprimo(長)和私有靜態長volteado(長),看看那裏得到您。

18

只需在這兩個方法的聲明中添加static,編譯時錯誤就會消失!

默認情況下,在C#方法是實例方法,他們收到隱含的「自我」的說法。通過使它們成爲靜態的,不需要這樣的參數(也不可用),並且該方法當然必須避免訪問該類的任何實例(非靜態)對象或方法。

靜態方法
更多信息中提供的類和方法的訪問修飾符(公共與私有)都OK,靜態方法就可以從任何地方調用,而不必事先實例化類的一個實例。換句話說靜態方法是用下面的語法中使用:

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

的靜態方法一個典型例子在System.Math類被發現,由此我們可以調用一串這些方法像

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

沒有實例化一個「數學」類(實際上我甚至不知道這樣的例子是否可能)

+3

+ +1提供洞察問題,而不僅僅是一個快速修復:這對於C#的新手來說更加有用學習基礎知識。然而,我有兩條意見:1)Math是一個靜態類(http://msdn.microsoft.com/en-us/library/system.math.aspx),所以你的懷疑是正確的:它不能被實例化; 2)也許你應該提供一些實例方法的例子......想到無處不在的ToString()。 – 2010-03-24 04:51:20

0

你只需要使siprimo和volteado方法是靜態的。

private static bool siprimo(long a) 

private static long volteado(long a) 
0

錯誤消息意味着你需要在Program類的一個實例調用volteadosiprimo。例如: -

... 
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是靜態的,而volteadosiprimo是不被調用。

解決這個問題的最簡單的方法是使volteadosiprimo方法靜:

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

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

創建一個類,並把所有的代碼在那裏,並呼籲從主這個類的一個實例:

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

這是對這個問題的真正解決方案 – 2012-08-29 14:15:04

+0

是的,從長遠來看,作爲一種良好的習慣,您應該將其封裝在課堂上。 – Patricio 2017-07-16 10:36:42

相關問題