Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:";非静态字段、方法或属性需要对象引用……”;_C# - Fatal编程技术网

C# 错误:";非静态字段、方法或属性需要对象引用……”;

C# 错误:";非静态字段、方法或属性需要对象引用……”;,c#,C#,我正在用C#创建一个应用程序。它的功能是评估一个给定的数是否为素数,以及相同的交换数是否也是素数 当我在Visual Studio中构建解决方案时,它说“非静态字段、方法或属性需要对象引用…”。我对“volteado”和“siprimo”方法有这个问题 问题出在哪里?如何解决 namespace ConsoleApplication1 { class Program { static void Main(string[] args) {

我正在用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;
        }
    }
}
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
控制台。写(“写一个数字:”);
long a=Convert.ToInt64(Console.ReadLine());//a是用户给定的数字
long av=volteado(a);//av是“a”,但已交换
如果(siprimo(a)=假&&siprimo(av)=假)
WriteLine(“原始和交换的数字都是素数。”);
其他的
WriteLine(“其中一个数字不是素数”);
Console.ReadLine();
}
二等兵布尔·西普里莫(长a)
{
//评估收到的数字是否为素数
bool sp=true;
对于(长k=2;k0)
{
v=10*v+a%10;
a/=10;
}
返回v;
}
}
}

将您的签名更改为私有静态bool-siprimo(long a)和私有静态long-volteado(long a),然后看看这会给您带来什么。

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

 static private long volteado(long a)

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

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

有关静态方法的更多信息
如果类和方法的访问修饰符(public和private)正常,那么就可以从任何地方调用静态方法,而无需事先实例化类的实例。换句话说,静态方法与以下语法一起使用:

    className.classMethod(arguments)
rather than
    someInstanceVariable.classMethod(arguments)
在System.Math类中可以找到静态方法的一个经典示例,我们可以通过该类调用一组此类方法,如

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

如果不实例化“Math”类(事实上我甚至不知道这样的实例是否可能)

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

private static bool siprimo(long a)


错误消息意味着您需要在
程序
类的实例上调用
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)
{
   ...
}

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

}

欢迎来到StackOverflow!请以后使用更具描述性的问题名称:)请编辑您的问题以进行格式设置。代码格式不包括代码的前几行。进行了相关格式设置,标题编辑:)@user300484您应该通过单击评级下方的复选框将此答案标记为正确。此问题的真实答案由shazia提供,这是一个没有编程意义的变通方法。当你编写一个快速扔掉的控制台程序时,这是有意义的。+1用于洞察问题,而不仅仅是快速修复:这对于C语言的新手来说更有用,因为他们仍在学习基础知识。然而,我有两个方面的评论:1)Math是一个静态类(),所以你的怀疑是对的:它不能被实例化;2)也许你应该提供一些实例方法的例子。。。我想到了无处不在的ToString()。这是这个问题的真正解决方案是的,从长远来看,作为良好的实践,你应该将它封装在一个类中。这个解决了我的问题。
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

}