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


274

考慮してください:

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)にはオブジェクト参照が必要です

回答:


401

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

  1. 呼び出されたメンバーも静的にします。

    static void setTextboxText(int result)
    {
        // Write static logic for setTextboxText.  
        // This may require a static singleton instance of Form1.
    }
  2. 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こともオプションになります。

  3. 呼び出しメソッドを(の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を参照してください


18

静的メソッドを実行するスレッドを開始しますSumData。ただし、静的ではないSumData呼び出しSetTextboxText。したがって、を呼び出すにはフォームのインスタンスが必要ですSetTextboxText


13
この答えは、問題を再度述べているようです。これによりエラーが発生する理由は説明されていません。
Robert

13

この場合、フォームのコントロールを取得する必要があり、このエラーを受け取っているので、少しバイパスします。

Program.csに移動して変更します

Application.Run(new Form1());

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

これで、コントロールにアクセスできます

Program.form1.<Your control>

また、Control-Access-LevelをPublicに設定することを忘れないでください。

そして、はい、わかっています。この回答は質問の発信者には適合しませんが、コントロールにこの特定の問題があるグーグルに適合します。


6

メソッドは静的でなければなりません

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

この特定のメソッドは、インスタンスプロパティ(具体的にはthis.InvokeRequiredおよびthis.Invoke)に明示的にアクセスするため、静的にすることはできません。
dbc

2

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

1

私の見たところ、あなたはテキストボックスにnull値を与え、ToString()それが静的メソッドなのでaに戻ります。Convert.ToString()null値を有効にできるものに置き換えること ができます。


0

動的に生成された一部のコンテンツ、つまりrunat = serverのコントロールについてInnerHtmlをチェックしていたため、実際にこのエラーが発生しました。

これを解決するには、メソッドの "static"キーワードを削除する必要があり、問題なく実行されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.