为什么我的 C# 程序会为我的简单税务计算器应用程序显示错误?

Why does my C# program display an error for my simple tax calculator appclication?

我正在学习 C#,需要使用 Visual Studio 为学校创建一个简单的税收计算器,我想我遵循了大部分说明,但我不断收到此错误:

Error   1   Operator '*' cannot be applied to operands of type 'object' and 'object'    C:\Visual Studio 2012\Projects\CS4\CS4Form.cs   83  32  CS4

我做错了什么,我该如何让它工作?它应该看起来像一个简单的 windows 表单应用程序,并且应该在右侧的标签中显示计算结果。我尽力遵循伪代码,但我不确定缺少什么,而且我一整天都在研究它。这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// CS4 
namespace CS4
{
    public partial class FrmCS4 : Form
    {
        public FrmCS4()
        {
            InitializeComponent();
        }
        // Declare class-level variables and constants
        // Class variables are initialized  to zero when declared

        int cintEmployeeCount;
        decimal cdecTotalNetpay;

        const decimal cdecFICA_RATE = 0.06M;
        const decimal cdecFEDERAL_RATE = 0.15M;
        const decimal cdecSTATE_RATE = 0.05M;
        const decimal cdecUNION_DUES = 10.00M;

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void label6_Click(object sender, EventArgs e)
        {

        }

        private void label9_Click(object sender, EventArgs e)
        {

        }

        private void label12_Click(object sender, EventArgs e)
        {

        }

        private void groupBox2_Enter(object sender, EventArgs e)
        {

        }

        private void btnCalculate_Click(object sender, EventArgs e)
        {
            // Declare medthod variables

            int decGross;
            decimal decFica;
            decimal decFederal;
            decimal decState;
            decimal decNetpay;

            // Input
            // Use nested try-catch blocks to get input values
            try
            {
                // Get hours worked from textbox 
                cintEmployeeCount = int.Parse(hoursWorkedBox.Text);
                try
                {
                    // Get pay rate from textbox 
                    cdecTotalNetpay = decimal.Parse(payRateBox.Text);

                    // Calculate gross amount 
                    decGross = intHours * decRate;
                    // Calculate taxes 

                    decFica = decGross * cdecFICA_RATE;
                    decFederal = decGross * cdecFEDERAL_RATE;
                    decState = decGross * cdecSTATE_RATE;

                    // Calculate net pay 
                    decNetpay = decGross - (decFica + decFederal + decState + cdecUNION_DUES);

                    // Accumulate summary values 
                    // Calculate average net pay 
                    cdecTotalNetpay += decNetpay;
                    cintEmployeeCount += 1;
                    decAverageNetpay = cdecTotalNetpay / cintEmployeeCount;


                    //Accumulate summary values 
                    //Calculate average net pay 

                    //Display results of calculations and summary values
                }
                catch (FormatException err)
                {
                    MessageBox.Show("Pay Rate must be numeric. " + err.Message,
                      "Data Entry Error", MessageBoxButtons.OK,
                      MessageBoxIcon.Exclamation);
                    payRateBox.SelectAll();
                    payRateBox.Focus();
                }
            }
            catch (FormatException err)
            {
                MessageBox.Show("Hours worked must be numeric. " + err.Message,
                  "Data Entry Error", MessageBoxButtons.OK,
                  MessageBoxIcon.Exclamation);
                hoursWorkedBox.SelectAll();
                hoursWorkedBox.Focus();
            }
            catch (Exception err)
            {
                MessageBox.Show("Unexpected Error: " + err.Message);
            }
        }//end method 



        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void label14_Click(object sender, EventArgs e)
        {

        }

        private void label17_Click(object sender, EventArgs e)
        {

        }

        private void label5_Click(object sender, EventArgs e)
        {

        }

        private void lblFederal_Click(object sender, EventArgs e)
        {

        }

        public object intHours { get; set; }

        public object decRate { get; set; }

        public decimal decAverageNetpay { get; set; }

        private void btnClear_Click(object sender, EventArgs e)
        {
            // Use Clear or null string "" for TextBoxes, but
            // only use null string "" for Labels

            hoursWorkedBox.Clear();   // Clear
            payRateBox.Clear();

            lblGross.Text = "";
            lblFica.Text = "";
            lblState.Text = "";
            lblFederal.Text = "";
            lblUnion.Text = "";
            lblNet.Text = "";
            lblTotalNet.Text = "";
            lblEmployee.Text = "";
            lblAverage.Text = "";


            //Reset Accumulators
            cdecTotalNetpay = 0;
            cintEmployeeCount = 0;
            decAverageNetpay = 0;

            hoursWorkedBox.Focus();
        }


        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}
     // End of class
    // End of namespace 

谁能给点指导或者建议和意见?同样,我对此很陌生,非常感谢任何帮助!

这是第 83 行:

decGross = intHours * decRate;

问题出在您的打字上(即:数据类型,而不是您的键盘技能)。尽管您使用匈牙利表示法 (which is officially discouraged, btw),但您的类型不正确。

  • decGross 被定义为一个整数(Int32) 当它应该是 Decimal
  • intHours 被定义为一个 Object 而它应该是一个整数
  • decRate 被定义为 Object 而它应该是 Decimal

未为 Object 个实例定义乘法运算(因为它没有意义)。

虽然变量的基础值很可能是数字,但编译器不知道这一点,因为您将它们键入 Object 而不是 Decimal。 C# 是静态类型的(在编译时)。我怀疑您来自 VB 背景并且习惯了 VB 的后期绑定和可选的运行时类型检查,其中允许执行 Variant 类型的乘法运算。

1)您应该将 intHours 和 decRate 转换为任何数字类型

decGross = (int)intHours * (Decimal)decRate;

decGross 应该是数字

2)更好的方法是将 intHours 和 decRate 的类型相应地更改为 int 和 decimal 因为拆箱。 https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

P.S。对不起,如果我的英语不好