错误:“非静态字段,方法或属性需要对象引用...”
我在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;
}
}
}
您无法从静态方法访问非静态成员。 (请注意,Main()
是静态的,这是.Net的要求)。只需将静态关键字放在它们的前面,就可以使siprimo和volteado成为静态。例如:
static private long volteado(long a)
问题解决了!谢谢:) – user300484 2010-03-24 03:51:50
@ user300484你应该点击评级下面的检查标记这个答案是正确的。 – mxmissile 2010-03-24 03:55:07
这个问题的真正答案是由shazia提供的,这是一个没有编程意义的解决方法 – 2012-08-29 14:15:49
改变你的签名,以私人静态布尔siprimo(长)和私有静态长volteado(长),看看那里得到您。
只需在这两个方法的声明中添加static
,编译时错误就会消失!
默认情况下,在C#方法是实例方法,他们收到隐含的“自我”的说法。通过使它们成为静态的,不需要这样的参数(也不可用),并且该方法当然必须避免访问该类的任何实例(非静态)对象或方法。
静态方法
更多信息中提供的类和方法的访问修饰符(公共与私有)都OK,静态方法就可以从任何地方调用,而不必事先实例化类的一个实例。换句话说静态方法是用下面的语法中使用:
className.classMethod(arguments)
rather than
someInstanceVariable.classMethod(arguments)
的静态方法一个典型例子在System.Math类被发现,由此我们可以调用一串这些方法像
Math.Sqrt(2)
Math.Cos(Math.PI)
没有实例化一个“数学”类(实际上我甚至不知道这样的例子是否可能)
+ +1提供洞察问题,而不仅仅是一个快速修复:这对于C#的新手来说更加有用学习基础知识。然而,我有两条意见:1)Math是一个静态类(http://msdn.microsoft.com/en-us/library/system.math.aspx),所以你的怀疑是正确的:它不能被实例化; 2)也许你应该提供一些实例方法的例子......想到无处不在的ToString()。 – 2010-03-24 04:51:20
你只需要使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)
{
...
}
创建一个类,并把所有的代码在那里,并呼吁从主这个类的一个实例:
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
}
这是对这个问题的真正解决方案 – 2012-08-29 14:15:04
是的,从长远来看,作为一种良好的习惯,您应该将其封装在课堂上。 – Patricio 2017-07-16 10:36:42
欢迎来到*!请在将来使用更多的描述性问题名称:) – Matchu 2010-03-24 03:38:40
请编辑您的问题进行格式化。您的代码的前几行不包含在代码格式中。 – 2010-03-24 03:38:55
作出相关格式化,标题编辑:) – Matchu 2010-03-24 03:39:44