【问题标题】:Error: "an object reference is required for the non-static field, method or property..." [duplicate]错误:“非静态字段、方法或属性需要对象引用...” [重复]
【发布时间】:2010-03-24 03:37:31
【问题描述】:

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

【问题讨论】:

  • 欢迎来到 StackOverflow!以后请使用更具描述性的问题名称:)
  • 请编辑您的问题以进行格式化。代码格式未涵盖代码的前几行。
  • 制作相关格式,标题编辑:)

标签: c#


【解决方案1】:

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

 static private long volteado(long a)

【讨论】:

  • @user300484 您应该通过单击评分下方的复选标记将此答案标记为正确。
  • 这个问题的真正答案由 shazia 提供,这是一个没有编程意义的解决方法
  • 当您编写一个快速丢弃的控制台程序时,这很有意义。
【解决方案2】:

创建一个类并将所有代码放入其中并从 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

}

【讨论】:

  • 这才是真正解决这个问题的方法
  • 是的,从长远来看,作为一种好的做法,您应该将其封装在一个类中。
  • 这个解决了我的问题。
【解决方案3】:

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

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

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

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

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

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

从未实例化“数学”类(事实上我什至不知道这样的实例是否可能)

【讨论】:

  • +1 用于深入了解问题而不仅仅是快速修复:这对于仍在学习基础知识的 C# 新手更有用。但是,我有两个方面的 cmets:1)数学是一个静态类(msdn.microsoft.com/en-us/library/system.math.aspx)所以你的怀疑是正确的:它不能被实例化;和 2) 也许你应该提供一些实例方法的例子......我想到了无处不在的 ToString()。
【解决方案4】:

将你的签名更改为 private static bool siprimo(long a) 和 private static long volteado(long a),看看你会得到什么。

【讨论】:

    【解决方案5】:

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

    private static bool siprimo(long a)
    

    private static long volteado(long a)
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        相关资源
        最近更新 更多