CS0120:非静态字段,方法或属性'foo'需要对象引用

hud*_*uda 242 c#

考虑:

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //int[] val = { 0, 0};
            int val;
            if (textBox1.Text == "")
            {
                MessageBox.Show("Input any no");
            }
            else
            {
                val = Convert.ToInt32(textBox1.Text);
                Thread ot1 = new Thread(new ParameterizedThreadStart(SumData));
                ot1.Start(val);
            }
        }

        private static void ReadData(object state)
        {
            System.Windows.Forms.Application.Run();
        }

        void setTextboxText(int result)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
            }
            else
            {
                SetTextboxTextSafe(result);
            }
        }

        void SetTextboxTextSafe(int result)
        {
            label1.Text = result.ToString();
        }

        private static void SumData(object state)
        {
            int result;
            //int[] icount = (int[])state;
            int icount = (int)state;

            for (int i = icount; i > 0; i--)
            {
                result += i;
                System.Threading.Thread.Sleep(1000);
            }
            setTextboxText(result);
        }

        delegate void IntDelegate(int result);

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?

非静态字段,方法或属性'WindowsApplication1.Form1.setTextboxText(int)需要对象引用

小智 355

看起来您正在从静态方法调用非静态属性.您需要将属性设置为静态,或者创建Form1的实例.

static void SetTextboxTextSafe(int result)
{
    label1.Text = result.ToString();
}
Run Code Online (Sandbox Code Playgroud)

要么

private static void SumData(object state)
{
    int result;
    //int[] icount = (int[])state;
    int icount = (int)state;

    for (int i = icount; i > 0; i--)
    {
        result += i;
        System.Threading.Thread.Sleep(1000);
    }
    Form1 frm1 = new Form1();
    frm1.setTextboxText(result);
}
Run Code Online (Sandbox Code Playgroud)

有关此错误的更多信息可以在MSDN上找到.


Bri*_*sen 19

您启动一个运行静态方法的线程SumData.但是,SumData呼叫SetTextboxText不是静态的.因此,您需要一个表单实例来调用SetTextboxText.

  • 这个答案似乎重申了这个问题.它没有解释*为什么*这会产生错误. (10认同)
  • @罗伯特所有其他答案也没有......这个评论毫无意义 (4认同)

COO*_*UBE 11

在这种情况下,如果您希望获得表单控件并且收到此错误,那么我有一点绕道.

转到Program.cs并进行更改

Application.Run(new Form1());
Run Code Online (Sandbox Code Playgroud)

public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
Run Code Online (Sandbox Code Playgroud)

现在您可以访问控件了

Program.form1.<Your control>
Run Code Online (Sandbox Code Playgroud)

另外:不要忘记将Control-Access-Level设置为Public.

是的,我知道,这个答案不适合调用者的问题,但它适合具有控件的这个特定问题的googlers.


小智 7

你的方法必须是静态的

static void setTextboxText(int result)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); 
    }
    else
    {
        SetTextboxTextSafe(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此特定方法显式访问实例属性(特别是“this.InvokeRequired”和“this.Invoke”),因此不能设为静态。 (2认同)

小智 5

感谢@COOLGAMETUBE 向我透露了最终对我有用的方法。他的想法很好,但是当在创建表单后调用 Application.SetCompatibleTextRenderingDefault 时,我遇到了问题。因此,经过一点改变,这对我有用:


static class Program
{
    public static Form1 form1; // = new Form1(); // Place this var out of the constructor

/// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1 = new Form1()); } }

Run Code Online (Sandbox Code Playgroud)


小智 5

使函数静态。这必须解决你的问题。