1

ifステートメント内にオブジェクトのインスタンスを作成できますか?使用するコンストラクターを制御するために2つのチェックボックスを作成しましたが、「名前「mth」は現在のコンテキストに存在しません」というエラーメッセージが表示されます。

if (checkBox1.Checked && checkBox2.Checked)
        {
            Facto mth = new Facto(label3, wait_time, progressBar1);
        }
        else if(checkBox1.Checked==false && checkBox2.Checked)
        {
            Facto mth = new Facto(label3,wait_time);
        }
        else if (checkBox1.Checked && checkBox2.Checked == false)
        {
            checkBox1.Checked = false;
            Facto mth = new Facto();
        }
        else
        {
            Facto mth = new Facto();
        }


        int result = mth.Factorial(number);

私は何が間違っているのですか?私はC#を初めて使用しますが、まだそのコツはありません。どんな助けでもいただければ幸いです。前もって感謝します。

4

2 に答える 2

1

これはスコーピングの問題です。変数mthは、それが定義されているスコープ(この場合は括弧)内にのみ存在します。スコープを離れるとすぐに、variabelは使用できなくなります。mthコードの最後(およびスコープ外)で変数を使用するため、このエラーが発生します。これを修正するには、より高いスコープで変数を定義する必要があります。そこに割り当てる必要はないことに注意してください。

これにより、次のようになります(スコープレベルが見やすくなるように、角かっこを再フォーマットしたことに注意してください)

    Facto mth; // Define it as the most outer scope level you are using it
    if (checkBox1.Checked && checkBox2.Checked)
    {
         mth = new Facto(label3, wait_time, progressBar1);
    }
    else 
        if(checkBox1.Checked==false && checkBox2.Checked)
        {
            mth = new Facto(label3,wait_time);
        }
        else 
            if (checkBox1.Checked && checkBox2.Checked == false)
            {
                checkBox1.Checked = false;
                mth = new Facto();
            }
            else
            {
                mth = new Facto();
            }

   int result = mth.Factorial(number);

編集:あなたの場合のように厳密に必要とされていない場合でも、すべての場合とそれ以外の場合は常に{}角かっこを使用することをお勧めします。レイアウトでわかるように、最初の他の場所がどこで終了するかを確認するのはそれほど簡単ではなく、「int結果行はその一部ではありません。

于 2012-07-27T09:31:01.260 に答える
0

ここでの問題は、ifブロック内にインスタンスを作成しないことです。m番目の参照はif/elseブロックで宣言されます。これにより、可視性/スコープがそのブロックのみに制限されます。したがって、行int result = mth.Factorial(number);で参照しようとすると、mthは使用できません。

ifブロックの外側でmthを宣言し、if/elseブロックの内側でのみインスタンス化します。例:

Facto mth;
if (checkBox1.Checked && checkBox2.Checked)
{
    mth = new Facto(label3, wait_time, progressBar1);
}
...

基本的な情報については、http://msdn.microsoft.com/en-us/library/aa691132 (v = vs.71).aspxを参照してください。

于 2012-07-27T09:40:07.207 に答える