【问题标题】:Getting Object reference required for the non-static method获取非静态方法所需的对象引用
【发布时间】:2016-04-14 02:29:48
【问题描述】:

请注意,这是未完成的代码,但只是面临一些小问题,因为我使用了很多 c++ OOP 概念。尝试从另一个平台进行更改时,我可能会遇到一些问题。

编译并声明非静态方法/属性错误时出现错误

using System;

public class People
{
    string name;
    int age;
    int height;
    public virtual void insertDetail(People stu)
    {
        Console.Write("Please enter name : ");
        stu.name = Console.ReadLine();
        Console.Write("Please enter age  : ");
        while(!int.TryParse(Console.ReadLine(), out stu.age))
        {
            Console.WriteLine("You enter characters! Please re-insert");
        }
        Console.Write("Please enter height: ");
        while(!int.TryParse(Console.ReadLine(), out stu.height))
        {
            Console.WriteLine("You enter characters! Please re-insert");
        }
    }
}

public class Class : People
{
    static People[] students = new People[5];
    public override void insertDetail(People stu)
    {
        Console.WriteLine("==================================");
        base.insertDetail(stu);
    }


    public static void Main(string[] args)
    {

        for (int i = 0; i < students.Length; i++)
        {
            students[i] = new People();
            insertDetail(students[i]);
        }

        Console.ReadKey();
    }
}

【问题讨论】:

  • 由于您的Mainstatic,所以您无法获得students 哪个... 我不知道它在哪里声明!
  • 是的,在 Main 中,students 没有被声明。它是一个完全不同的类中的实例字段。无论如何,Main 在哪个班级?无论如何,你需要一个 `` 在 Main 中的实例。
  • insertDetail 是一个实例方法而不是静态方法,为Class 创建一个实例并使用它。前Class c = new Class(); c.insertDetail(..)
  • 您还需要一个 People 实例来调用 insertDetail,Class.People 应该是 List&lt;People&gt;,而不是数组。然后你可以添加任意数量的。
  • 对不起。我重新编辑我的代码!

标签: c# non-static


【解决方案1】:

如cmets中所说,使用实例方法需要一个实例。

Main 内为Class 创建一个实例

public class Class : People
{
    static People[] students = new People[5];
    public override void insertDetail(People stu)
    {
        Console.WriteLine("==================================");
        base.insertDetail(stu);
    }


    public static void Main(string[] args)
    {
        Class c = new Class(); // this is required to access insertDetail

        for (int i = 0; i < students.Length; i++)
        {
            students[i] = new People();
            c.insertDetail(students[i]);
        }

        Console.ReadKey();
    }
}

查看Demo

【讨论】:

  • 完美。我想要的答案!
【解决方案2】:

当您真正需要实例时,使用类型名称作为限定符对像 Object.ToString() 这样的实例方法进行静态调用时,会出现该错误。

【讨论】:

    【解决方案3】:

    首先从不使用Class作为你的班级名称。 至于错误,您需要提供有关您要做什么的更多信息。您必须在您的方法中添加 static 修饰符:

    public static void insertDetail(People stu)
    

    或者如果您希望它被覆盖:

    public virtual void insertDetail()
    {
        this.name = "Some name";
        //...
    }
    

    【讨论】:

    • @Downvoters,对于您不满意的地方,请至少留下一些小小的评论。不要那么害羞;)
    • 1) 代表学校学生班级的班级可以合理地称为班级。 2)不知道实例化类的解决方法是不要使整个程序中的所有内容都静态。你甚至 OOP,兄弟?解决方法是了解类的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多