CS0120: 非静的フィールド、メソッド、またはプロパティ 'foo' にはオブジェクト参照が必要です 質問する

CS0120: 非静的フィールド、メソッド、またはプロパティ 'foo' にはオブジェクト参照が必要です 質問する

考慮する:

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

このエラーはなぜ発生するのでしょうか?

非静的フィールド、メソッド、またはプロパティ 'WindowsApplication1.Form1.setTextboxText(int)' にはオブジェクト参照が必要です。

ベストアンサー1

setTextboxText静的メソッド (具体的には ) から非静的メンバー (具体的にはプロパティまたはメソッド ) を呼び出しているようですSumData。次のいずれかを行う必要があります。

  1. 可能であれば、setTextboxText静的にします。
    static void setTextboxText(int result)

ただし、この場合、setTextboxText はインスタンス変数へのアクセスを必要とするため、静的にすることはできません。
代わりに、次のようにします。

  1. setTextboxTextForm1 の静的シングルトン経由で呼び出します。
class Form1
{
    public static Form1 It;   // Singleton.

    public Form1()
    {
        It = this;
    }

    private static void SumData(object state)
    {
        ...
        It.setTextboxText(result);
    }
}
  1. Form1呼び出しメソッド内でのインスタンスを作成します。

    private static void SumData(object state)
    {
        int result = 0;
        //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);
    }
    

    ただし、Form1 のインスタンスが既に存在する場合、これは必要な動作を行いません。
    のインスタンスを渡すことForm1もオプションになります。

  2. 呼び出しメソッドを非静的インスタンスメソッド(Form1)にします。

     private void SumData(object state)
     {
         int result = 0;
         //int[] icount = (int[])state;
         int icount = (int)state;
    
         for (int i = icount; i > 0; i--)
         {
             result += i;
             System.Threading.Thread.Sleep(1000);
         }
         setTextboxText(result);
     }
    

このエラーに関する詳細情報はMSDNで

おすすめ記事