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

时间:2010-03-24 03:37:31

标签: c#

我正在用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;
        }
    }
}

6 个答案:

答案 0 :(得分:60)

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

 static private long volteado(long a)

答案 1 :(得分:33)

创建一个类并将所有代码放在那里,并从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

}

答案 2 :(得分:20)

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

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

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

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

在System.Math类中可以找到静态方法的经典示例,我们可以调用一堆这样的方法,如

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

没有实例化“Math”类(实际上我甚至不知道这样的实例是否可行)

答案 3 :(得分:3)

将您的签名更改为私有静态bool siprimo(长a)和私有静态long volteado(长a)并查看它的位置。

答案 4 :(得分:0)

您只需要将siprimo和volteado方法设为静态。

private static bool siprimo(long a)

private static long volteado(long a)

答案 5 :(得分:0)

错误消息表示您需要在volteado类的实例上调用siprimoProgram。 E.g:

...
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则不是。{/ p>

解决此问题的最简单方法是将volteadosiprimo方法设为静态:

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

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