为什么我在尝试调用 ShowStatement 方法时收到 System.InvalidCastException?

Why am I receiving an System.InvalidCastException when I am trying to call my ShowStatement method?

我可以通过另一种形式将不同类型的帐户添加到列表语句中,然后我可以将其添加到列表框 lstaccounts 中。但是,当我 select 我的列表框中的一个帐户并按下查看语句按钮时,我在 'lblBank.Text = ShowStatement((IStatement)lstAccounts.SelectedItem);' 行上收到该异常...知道为什么会发生这种情况吗?

 public List<IStatement> statements;       
    private int accountCounter = 0;
    private int statementsViewed = 0;

    public Form1()
    {
        InitializeComponent();           
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        statements = new List<IStatement>();           
    }

    private void btnView_Click(object sender, EventArgs e)
    {
        if (lstAccounts.SelectedIndex > -1)
        {
            lblBank.Text = ShowStatement((IStatement)lstAccounts.SelectedItem);
            statementsViewed += 1;
            lblTotal.Text = statementsViewed.ToString();
        }
    }

    private string ShowStatement(IStatement item)
    {
        String msg = "Account Number: " + item.AccountNumber + "\n" 
                    + "Name: "  + item.AccountName  + "\n" + item.PrintStatement();
        return msg;
    }

    private void btnAddAccount_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();

        if(form2.ShowDialog() == DialogResult.OK)
        {
            if (form2.txtValue.Text == "" && form2.txtMinMonthly.Text == "")
            {
                BankAccount b = form2.GetBankAccount();
                statements.Add(b);
            }

            else if (form2.txtMinMonthly.Text == "")
            {
                InsurancePolicy i = form2.GetInsurancePolicy();
                statements.Add(i);
            }

            else
            {
                PlatinumCurrent p = form2.GetPlatinumCurrent();
                statements.Add(p);                 
            }

            foreach (IStatement os in statements)
            {
                lstAccounts.Items.Add(os.ToString());
                accountCounter += 1;
            }
        }
    }

我得到的确切错误是:System.InvalidCastException:“无法将类型 'System.String' 的对象转换为类型 'TelephoneBanking.IStatement'。”

您在 btnAddAccount_Click 中将其添加为 .ToString()。尝试添加项目,而不是 item.ToString()。

private void btnAddAccount_Click(object sender, EventArgs e)
    {
        ...
            foreach (IStatement os in statements)
            {
                lstAccounts.Items.Add(os); // ###### removed os.ToString() ######
                accountCounter += 1;
            }
        ...