0

さて、私はかなり最近行った私の学校のプロジェクトの 1 つからこのアイデアをモデル化していますが、なぜそれが現時点でうまくいかないのかわかりません.

プログラムの現在の計画は、DataManager を使用して、ユーザーがメニューから入力する数値を含む文字列配列を保持し、それらを整数に変換し、最終的に演算子などでそれらを線引きすることです。私は最後の部分を理解していませんし、私が音を立てたようにそのアイデアがうまくいくとは思いません。しかし、現在、プログラムが文字列値を配列に格納するのに問題があります。

プログラムを実行するときの現在の目標は、「1」をクリックして「Enter」を押すことです。その場合、出力を「Number: 1」のようにしたいのですが、例外をスローし続けます。

「タイプ 'System.InvalidCastException' の未処理の例外が mscorlib.dll で発生しました

追加情報: ソース配列の少なくとも 1 つの要素が、宛先配列型にキャストできませんでした。」

これが私のDataManagerクラスのコードです....

public class DataManager 
{ 
public ArrayList calculation;

    public DataManager()
    {
        calculation = new ArrayList();
    }

    public void addNumbers(string n)
    {
        calculation.Add(n);
    }
    // public NumbersAndOperators[] getNumbers()
    //{
      // return  //(NumbersAndOperators[])calculation.ToArray(typeof(NumbersAndOperators));
    //}
    public void removeNumbers(NumbersAndOperators n)
    {
        calculation.Remove(n);
    }
    public void addOperators(string o)
    {
        calculation.Add(o);
    }
    public NumbersAndOperators[] getOperators()
    {
        return (NumbersAndOperators[])calculation.ToArray(typeof(NumbersAndOperators));
    }
    public void removeOperators(NumbersAndOperators o)
    {
        calculation.Remove(o);
    }

}

}

これが私のNumbersAndOperatorsクラスのコードです

public class NumbersAndOperators 
{ 
private string number; private string operate;

    public NumbersAndOperators(string n, string o)
    {
        number = n;
        operate = o;
    }
    public void setNumber(string n)
    {
        number = n;
    }
    public void setOperate(string o)
    {
        operate = o;
    }
    public string getNumber(string n)
    {
        return n;
    }
    public string getOperate(string o)
    {
        return o;
    }

}

}

これが私のフォームのコードです

public partial class Form1 : Form 

{ 
   public DataManager data;

    public Form1(DataManager d)
    {
        InitializeComponent();
        data = d;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
    private void button10_Click(object sender, EventArgs e)
    {
        string n = "0";
        data.addNumbers(n);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        string n = "1";
        data.addNumbers(n);

    }

    private void button2_Click(object sender, EventArgs e)
    {
        string n = "2";
        data.addNumbers(n);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        string n = "3";
        data.addNumbers(n);
    }
    private void button4_Click(object sender, EventArgs e)
    {
        string n = "4";
        data.addNumbers(n);
    }

    private void button5_Click(object sender, EventArgs e)
    {
        string n = "5";
        data.addNumbers(n);
    }

    private void button6_Click(object sender, EventArgs e)
    {
        string n = "6";
        data.addNumbers(n);

    }

    private void button7_Click(object sender, EventArgs e)
    {
        string n = "7";
        data.addNumbers(n);
    }

    private void button8_Click(object sender, EventArgs e)
    {
        string n = "8";
        data.addNumbers(n);
    }

    private void button9_Click(object sender, EventArgs e)
    {
        string n = "9";
        data.addNumbers(n);
    }

    private void division_Click(object sender, EventArgs e)
    {
        string o = "/";
        data.addOperators(o);
    }

    private void multiplication_Click(object sender, EventArgs e)
    {
        string o = "*";
        data.addOperators(o);
    }

    private void subtraction_Click(object sender, EventArgs e)
    {
        string o = "-";
        data.addOperators(o);
    }

    private void addition_Click(object sender, EventArgs e)
    {
        string o = "+";
        data.addOperators(o);
    }

    private void dec_Click(object sender, EventArgs e)
    {
        string n = ".";
        data.addNumbers(n);
    }


    private void equals_Click(object sender, EventArgs e)
    {
        panel1.Controls.Clear();
        NumbersAndOperators[] num = data.getNumbers();
        Label tmp;
        for (int i = 0; i < num.Length; i++)
        {
            tmp = new Label();
            tmp.Text = "Number:" + data.getNumbers();
            tmp.AutoSize = true;
            tmp.Location = new Point(0, 85);

            panel1.Controls.Add(tmp);

        }

    }

}

}

ありとあらゆるアドバイスに感謝します。これは私がこれまでに見たことのない問題であり、読むだけでは理解がさらに難しくなります。私はしばらくの間、ばかのようにグーグルで検索してきましたが、出てくるすべてが理解できません。

また、例外をスローしている行をコメントアウトしました

4

3 に答える 3

2

電話すると:

public void addNumbers(string n)
{
    calculation.Add(n);
}

ArrayList に文字列を追加します。

電話すると:

(NumbersAndOperators[])calculation.ToArray(typeof(NumbersAndOperators));

NumbersAndOperators としてデータを取得しようとしますが、ArrayList に文字列を追加したため無効です。

計算メンバーを次のようにするのが最善です。

public List<NumbersAndOperators> calculation;

したがって、タイプセーフリストがあります。

于 2012-09-28T19:20:41.657 に答える
1

この行で:

return  (NumbersAndOperators[])calculation.ToArray(typeof(NumbersAndOperators));

の配列を取得しようとしてNumbersAndOperatorsいますが、ArrayList文字列も含まれており、文字列をNumbersAndOperators...にキャストすることはできません

于 2012-09-28T19:17:01.523 に答える
0

私はあなたが書くつもりだったと思います:

for (int i = 0; i < num.Length; i++)
{
    tmp = new Label();
    tmp.Text = "Number:" + num[i]; // <--
    tmp.AutoSize = true;
    tmp.Location = new Point(0, 85);

    panel1.Controls.Add(tmp);

}
于 2012-09-28T19:14:14.703 に答える