非静态字段,方法或属性DoStuff(int,int)'需要对象引用。

时间:2016-06-27 06:12:40

标签: c#

@angular/core

我做错了什么?

5 个答案:

答案 0 :(得分:3)

不允许在静态方法中调用非静态方法。如果要调用则需要对象引用。这是因为静态方法无法实例化。所以方法DoStuff应该是静态的,因此它的签名可能如下所示:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
} 

我还有一个建议可以改进您的代码;它只是使用int.TryParse代替简单.Parse。这也有助于您处理FormatException。所以完整的代码将如下所示:

class Program
{
    static void Main(string[] args)
    {
        int number1, number2;
        if (int.TryParse(Console.ReadLine(), out number1) && int.TryParse(Console.ReadLine(), out number2))
        {
            Console.WriteLine("the sum of numbers are :{0}", DoStuff(number1, number2));
        }
        else
            Console.ReadKey();
    }
    public static int DoStuff(int num1, int num2)
    {
        int result = num1 + num2;
        return result;
    }

}

答案 1 :(得分:0)

从静态函数中,您只能调用静态函数。 因此,将DoStuff函数更改为静态:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
}

了解更多信息:Static classes

非静态成员属于实例。如果不以某种方式解决你正在谈论的课程的哪个实例,它就毫无意义。在静态环境中,您没有实例,这就是为什么您无法明确提及对象引用而无法访问非静态成员的原因。

事实上,您可以通过明确指定对象引用来访问静态上下文中的非静态成员:

class HelloWorld {
   int i;
   public HelloWorld(int i) { this.i = i; }
   public static void Print(HelloWorld instance) {
      Console.WriteLine(instance.i);
   }
}

var test = new HelloWorld(1);
var test2 = new HelloWorld(2);
HelloWorld.Print(test);

如果没有明确引用Print方法中的实例,它怎么知道它应该打印1而不是2?

答案 2 :(得分:0)

您正在使用DoStuff作为静态方法。

您应该执行以下操作:

...
Console.ReadKey();
var program = new Program();
program.DoStuff(number1, number2);
...

因此,创建一个类的实例并在其上调用该方法。

如果您确实希望以静态方式使用该方法,则应该静态声明:

public static int DoStuff(int num1,int num2)
{
    int result = num1 + num2;
    return result;
} 

请参阅“public”之后的“static”关键字。

答案 3 :(得分:0)

来自C#规格:

  

1.6.6.3静态和实例方法

     

使用static修饰符声明的方法是静态方法。静态方法不能在a上运行   特定实例,只能直接访问静态成员。一个   没有静态修饰符声明的方法是实例方法。一个   instance方法在特定实例上运行,并且可以访问两者   静态和实例成员。实例方法的实例   被调用的可以像这样显式访问。这是一个错误   请参考静态方法。

您的<P...>方法是静态的,因此它只能访问静态成员。解决方案是改变:

Main

答案 4 :(得分:0)

您可以使用下面显示的静态方法填充方法或

public static  int DoStuff(int num1,int num2)
 {
    int result = num1 + num2;
    return result;
 }

静态方法:使用类型名称调用它们。不需要实例 - 这使它们稍微快一点。静态方法可以是公共的或私有的。

<强>的信息: 静态方法使用static关键字,通常作为第一个关键字或第二个关键字在public之后。 警告: 静态方法无法访问非静态类级别成员。它没有&#34;这个&#34;指针。

<强>实例 实例方法可以访问这些成员,但必须通过实例化对象进行调用。这增加了间接性。

例如

class Program
   {
    static void MethodA()
    {
        Console.WriteLine("Static method");
    }

    void MethodB()
    {
        Console.WriteLine("Instance method");
    }

    static char MethodC()
    {
        Console.WriteLine("Static method");
        return 'C';
    }

    char MethodD()
    {
        Console.WriteLine("Instance method");
        return 'D';
    }

    static void Main()
    {
        //
        // Call the two static methods on the Program type.
        //
        Program.MethodA();
        Console.WriteLine(Program.MethodC());
        //
        // Create a new Program instance and call the two instance methods.
        //
        Program programInstance = new Program();
        programInstance.MethodB();
        Console.WriteLine(programInstance.MethodD());
        Console.ReadLine();
    }
}