2012-09-28 36 views
0

好了,所以我在模擬這個想法把我的學校項目我有相當最近的一個,我不知道爲什麼它不是目前沒有工作。嘗試寫一個簡單的計算器...初學者使用C#,不能讓過去一個異常

我目前的計劃是使用DataManager來保存一個字符串數組,其中包含用戶從菜單中輸入的數字,然後將它們轉換爲整數,最後由操作員等通過它們進行描述。我還沒有弄清楚最後一部分,我不認爲這個想法會起作用,就像我說得那樣。但現在我無法讓程序將字符串值存儲在數組中。

當我運行程序我目前的目標是點擊「1」,然後按「Enter」鍵,當出現這種情況我想輸出看起來像「數量:1」,但我不斷拋出異常。

「‘’類型的未處理的異常出現在mscorlib.dll

其他信息:源陣列中的至少一種元素不能被拋棄到目標數組類型。 「

這裏是我的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

不要使用'ArrayList'或'NumbersAndOperators []',使用'List '。 –

+0

這可能只是您的文章中的錯字,但... typeof(NumbersAndOper> ators)您的類型中有多個符號... – Tony

+0

好眼,這個錯字僅在帖子中。我會解決它。 –

回答

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

} 
+0

這將工作,但它仍然拋出當然異常... –

1

在此行中:

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

你試圖得到的NumbersAndOperators數組,但你也ArrayList包含字符串和字符串不能轉換爲NumbersAndOperators ...

+0

如何將字符串投入NumbersAndOperators?我已經將int的值更改爲字符串......這令我感到費解...... –

+1

字符串和'NumbersAndOperators'是根本不同的類型,您不能也不應該將它們「投」到另一個。不要使用字符串,使用'NumbersAndOperators's。 –

2

當你撥打:

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

你一個字符串添加到您的ArrayList。

當你撥打:

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

它試圖檢索數據NumbersAndOperators,因爲你添加字符串到您的ArrayList這是無效的。

最好的辦法是有你的計算成員爲:

public List<NumbersAndOperators> calculation; 

讓您擁有一個類型安全的列表。

+0

所以我只是刪除它? { calculation = new ArrayList(); } –

+0

是的,您還需要通過計算=新列表()更換並相應地更改添加/刪除方法 – catflier

相關問題