CS0120: Uma referência de objeto é necessária para o campo não-estático, método ou propriedade 'foo'

Considere:

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();
        }
    }
}

Porque é que este erro está a ocorrer?

Uma referência de objeto é necessária para o campo não estático, método ou propriedade 'WindowsApplication1.Form1.setTextboxText(int)

Solução

Parece que você está chamando uma propriedade não estática a partir de um método estático. Você precisará ou tornar a propriedade estática, ou criar uma instância do Form1.

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

OU

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);
}

Mais informações sobre este erro podem ser encontradas em MSDN.

Comentários (0)

Você inicia um thread que executa o método estático SumData. Entretanto, SumData chama SetTextboxText que é't estático. Assim, você precisa de uma instância do seu formulário para chamar SetTextboxText.

Comentários (1)

Do meu olhar você dá um valor nulo para uma caixa de texto e retorna em um ToString(), pois é um método estático. Você pode substituí-lo por Convert.ToString() que pode habilitar um valor nulo.

Comentários (0)