【问题标题】:Why am I receiving an System.InvalidCastException when I am trying to call my ShowStatement method?为什么我在尝试调用 ShowStatement 方法时收到 System.InvalidCastException?
【发布时间】:2021-03-15 17:40:39
【问题描述】:

我可以通过另一种形式将不同类型的帐户添加到列表语句中,然后我可以将其添加到列表框 lstaccounts 中。但是,当我在列表框中选择一个帐户并按下查看报表按钮时,我在“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: 'Unable to cast object of 'System.String' to type 'TelephoneBanking.IStatement'。'

【问题讨论】:

  • lstAccounts 在哪里声明?它是什么类型的?假设您在代码中进一步使用lstAccounts.Items.Add(os.ToString())lstAccounts 似乎是一个字符串集合,那么您为什么要尝试将其中一个转换为IStatement

标签: c# oop interface


【解决方案1】:

您在 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;
            }
        ...

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多