错误:“非静态字段,方法或属性需要对象引用…”

我正在用C#创build一个应用程序。 它的function是评估一个给定是否为素数,以及是否相同的交换数字也是素数。

当我在Visual Studio中构build我的解决scheme时,它说“非静态字段,方法或属性需要对象引用…”。 我遇到了“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; } } } 

您不能从静态方法访问非静态成员。 (请注意, Main()是静态的,这是.Net的要求)。 只要将静态关键字放在它们前面,就可以使siprimo和volteado静态。 例如:

  static private long volteado(long a) 

创build一个类,并把所有的代码放在那里,并从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 } 

只需在这两个方法的声明中添加static ,编译时错误就会消失!

默认情况下,C#方法是实例方法 ,它们接收隐含的“self”参数。 通过使它们成为静态的,不需要这样的参数(也不可用),并且该方法当然必须避免访问类的任何实例(非静态)对象或方法。

有关静态方法的更多信息
如果类和方法的访问修饰符(public或private)都可以,则可以从任何地方调用静态方法,而不必事先实例化类的实例。 换句话说,静态方法使用以下语法:

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

一个经典的静态方法的例子可以在System.Math类中find,我们可以调用一堆这样的方法

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

没有实例化一个“math”类(实际上我甚至不知道这样的例子是否可能)

改变你的签名为私人静态bool siprimo(长a)和私人静态长volteado(长a),看看你到哪里。

你只需要使siprimo和volteado方法是静态的。

 private static bool siprimo(long a) 

 private static long volteado(long a) 

错误消息意味着您需要调用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) { ... }