错误:“非静态字段,方法或属性需要对象引用…”
我正在用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
类的实例上的volteado
和siprimo
。 例如:
... 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
是静态的,而volteado
和siprimo
则不是。
解决这个问题的最简单的方法是使volteado
和siprimo
方法是静态的:
private static bool siprimo(long a) { ... } private static bool volteado(long a) { ... }