2010-03-24 74 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

相关问题