-1

前の質問で、件名のタイトルのエラーメッセージについて尋ねましたが、答えはほとんど盲目的に明白でした。

ただし、その「煮詰められた」例は、それほど希釈されていないコードからのものであり、元の質問が新しいブロスに再び表示されます。

たくさんの「面白い」コメントに心を開いているのではないかと思いますが、ちょっと...ばかげた質問などはなく、ばかげたプログラマーだけです!」

とにかく、これは元のコードのほんの少しゆでたバージョンです:

public partial class Form1 : Form
{
    public static Form1 mForm = new Form1();


    // define textbox parameter structure
    struct ParmStruct
    {
        public TextBox sTextBoxName;
        public double dMinValue;
        public double dMaxValue;

        public ParmStruct(TextBox sTextBoxName, double dMinValue, double dMaxValue)
        {
            this.sTextBoxName = sTextBoxName;
            this.dMinValue = dMinValue;
            this.dMaxValue = dMaxValue;
        }
    }

    // Create list of Parameters (name, min, max)
    static ParmStruct[] ParmList = new ParmStruct[]
    {
        new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
        new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    };

    public Form1()
    {
        InitializeComponent();

        this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox tb1;

        tb1 = mForm.textBox1;
        tb1 = textBox2;

        double x = ParmList[0].dMaxValue;
    }
}

ParmList初期化の2行目は、(sTextBoxName = textBox2)作成しない限りコンパイルされません。sTextBoxName = mForm.textBox2.

ただし、行tb1 = textBox2はコンパイルされ、mFormは必要ありません。プレフィックス。

これは、元々混乱を引き起こした実際のケースです(そして、私に関する限り、今でもそうです)。

コンパイラー(VS 2010)が、ある場合にはそれを理解できるが、他の場合には理解できない理由はよくわかりません。

ああ...そしてコードはコンパイルされたときに機能します。:)

4

2 に答える 2

2

これは問題です。

// Create list of Parameters (name, min, max)
static ParmStruct[] ParmList = new ParmStruct[]
{
    new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 },
    new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
};

フォームの各インスタンスには独自の一意の があるため、この変数が のすべてのインスタンス間で共有されることは意味がありませんForm1(これはキーワードが行うことです) 。さらに、クリスが提案したように、単にキーワードを削除しても修正されません。作成されるまで参照することはできず、内部で発生します (コンストラクターによって呼び出されます)。これはより良いでしょう:statictextBox2statictextBox2InitializeComponentForm1

// list of Parameters (name, min, max)
ParmStruct[] ParmList;

public Form1()
{
    InitializeComponent();

    // now the textboxes exist and can be associated with the structure
    ParmList = new ParmStruct[] {
        new ParmStruct { sTextBoxName = textBox1, dMinValue = -99, dMaxValue = 99 },
        new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    };

    this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
}

textBox1_TextChangedコンストラクターとメソッドの両方の内部で参照できtextBox1、それ以上の修飾なしで、コンパイラーは、入力したかのように、オブジェクトにtextBox2属するものを見つけます(たとえば、コンストラクターの最後の like を参照)。コンパイラは のテキスト ボックスを使用しません。実際、静的フィールドを表示するコードがないため、静的フィールドを使用する理由はありません。thisthis.textBox1mFormmForm

于 2012-05-22T23:37:57.017 に答える
0

textBox2 は mForm のコンテキストにのみ存在するオブジェクトであるため、メソッドで宣言されていないか、クラスの [静的] オブジェクトとして宣言されていないため、mForm のフィールドとしてスコープする必要があります。

于 2012-05-22T23:30:22.213 に答える