编译器错误 CS0120

非静态的字段、方法或属性“member”要求对象引用

必须先创建对象实例,才能使用非静态的字段、方法或属性。 有关静态方法的详细信息,请参阅静态类和静态类成员。 有关创建类的实例的详细信息,请参阅实例构造函数。

示例 1

以下示例生成 CS0120:

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void Method() { }
    // Non-static property.
    public int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        i = 10;   // CS0120
        Method();   // CS0120
        int p = Prop;   // CS0120
    }
}

若要更正此错误,请首先创建类的实例:

// CS0120_1.cs
public class MyClass
{
    // Non-static field.
    public int i;
    // Non-static method.
    public void Method() { }
    // Non-static property.
    public int Prop
    {
        get
        {
            return 1;
        }
    }

    public static void Main()
    {
        var mc = new MyClass();
        mc.i = 10;
        mc.Method();
        int p = mc.Prop;
    }
}

示例 2

如果从静态方法调用非静态方法,也会生成 CS0120,如下所示:

// CS0120_2.cs
public class MyClass
{
    public void Method() { }

    public static void Main()
    {
        Method();   // CS0120
    }
}

若要更正此错误,请首先创建类的实例:

// CS0120_2.cs
public class MyClass
{
    public void Method() { }

    public static void Main()
    {
        var mc = new MyClass();
        mc.Method();
    }
}

示例 3

同样,静态方法不能调用实例方法,除非显式给它提供了类的实例,如下所示:

// CS0120_3.cs
using System;

public class MyClass
{
    public static void Main()
    {
        DoIt("Hello There");   // CS0120
    }

    private void DoIt(string sText)
    {
        Console.WriteLine(sText);
    }
}

若要更正此错误,还可以将关键字 static 添加到方法定义中:

// CS0120_3.cs
using System;

public class MyClass
{
    public static void Main()
    {
        DoIt("Hello There");
    }

    private static void DoIt(string sText)
    {
        Console.WriteLine(sText);
    }
}

另请参阅