启用Option Strict On后遭遇类型转换错误,寻求代码修正方案
启用Option Strict On后遭遇类型转换错误,寻求代码修正方案
嘿,我看到你开启Option Strict On后遇到了Double和String之间的隐式转换错误,这完全在意料之中——这个选项就是要强制我们显式处理类型转换,避免隐式转换带来的意外bug。咱们一步步拆解问题,修正你的代码:
问题根源分析
你的错误主要来自两个核心问题:
- 直接把控件的
Text属性(字符串类型)拿来和数值做运算,比如tbHourlyRate1.Text * tbOverTime1.Text,Option Strict On不允许这种无显式声明的类型转换 - 转换逻辑混乱:比如把TimeSpan转成字符串后又转回数值,完全绕了弯路;还有直接把数值类型赋值给
Text属性,没有转成字符串
核心修正步骤
- 直接用数值类型存储工时:不用把TimeSpan转成字符串再转回来,直接用
ts1.TotalHours获取小时数的Decimal值,一步到位 - 安全转换控件文本为数值:从TextBox读取的所有数值(时薪、加班系数等)都要显式转成数值类型,推荐用
Decimal.TryParse做安全转换(避免输入非数字时程序崩溃) - 分离计算与格式化:先完成所有数值计算,再把结果格式化为货币字符串赋值给控件的
Text属性 - 修复语法错误:原代码里存在括号不匹配的问题,这也会导致编译失败
修正后的完整代码
Option Strict On ' 原变量如果暂时未用到,可后续根据实际需求调整 Dim TotalHour1 To TotalHour14 As Double Private Sub BtnTotalWages_Click(sender As Object, e As EventArgs) Handles btnTotalWages.Click ' 计算员工1的工作时长(直接取小时数绝对值,避免字符串转换) Dim emp1Arrival = dtpDateIn1.Value.Date + dtpTimeIn1.Value.TimeOfDay Dim emp1Departure = dtpDateOut1.Value.Date + dtpTimeOut1.Value.TimeOfDay Dim ts1 As TimeSpan = emp1Departure.Subtract(emp1Arrival) Dim emp1TotalHours As Decimal = CDec(Math.Abs(ts1.TotalHours)) ' 计算员工2的工作时长 Dim emp2Arrival = dtpDateIn2.Value.Date + dtpTimeIn2.Value.TimeOfDay Dim emp2Departure = dtpDateOut2.Value.Date + dtpTimeOut2.Value.TimeOfDay Dim ts2 As TimeSpan = emp2Departure.Subtract(emp2Arrival) Dim emp2TotalHours As Decimal = CDec(Math.Abs(ts2.TotalHours)) ' 安全读取员工1的时薪和加班系数 Dim emp1HourlyRate As Decimal = 0D Decimal.TryParse(tbHourlyRate1.Text, emp1HourlyRate) Dim emp1OvertimeRate As Decimal = 0D Decimal.TryParse(tbOverTime1.Text, emp1OvertimeRate) ' 安全读取员工2的时薪和加班系数 Dim emp2HourlyRate As Decimal = 0D Decimal.TryParse(tbHourlyRate2.Text, emp2HourlyRate) Dim emp2OvertimeRate As Decimal = 0D Decimal.TryParse(tbOverTime2.Text, emp2OvertimeRate) ' 读取当前周薪用于累加 Dim emp1CurrentWeekWage As Decimal = 0D Decimal.TryParse(tbWagesPW1.Text, emp1CurrentWeekWage) Dim emp2CurrentWeekWage As Decimal = 0D Decimal.TryParse(tbWagesPW2.Text, emp2CurrentWeekWage) ' 根据选中的星期计算当日工资并累加周薪 If rbMon.Checked Then ' 员工1当日工资计算:正常工时工资 + 加班工资 Dim emp1DailyWage As Decimal = emp1TotalHours * emp1HourlyRate + emp1HourlyRate * emp1OvertimeRate tbMonday1.Text = FormatCurrency(emp1DailyWage) emp1CurrentWeekWage = emp1DailyWage tbWagesPW1.Text = FormatCurrency(emp1CurrentWeekWage) lblHrsWorked1.Text = emp1TotalHours.ToString("0.00") ' 格式化显示两位小数 ' 员工2同理 Dim emp2DailyWage As Decimal = emp2TotalHours * emp2HourlyRate + emp2HourlyRate * emp2OvertimeRate tbMonday2.Text = FormatCurrency(emp2DailyWage) emp2CurrentWeekWage = emp2DailyWage tbWagesPW2.Text = FormatCurrency(emp2CurrentWeekWage) lblHrsWorked2.Text = emp2TotalHours.ToString("0.00") ElseIf rbTue.Checked Then ' 员工1周二工资计算 Dim emp1DailyWage As Decimal = emp1TotalHours * emp1HourlyRate + emp1HourlyRate * emp1OvertimeRate tbTuesday1.Text = FormatCurrency(emp1DailyWage) emp1CurrentWeekWage += emp1DailyWage tbWagesPW1.Text = FormatCurrency(emp1CurrentWeekWage) lblHrsWorked1.Text = emp1TotalHours.ToString("0.00") ' 员工2同理 Dim emp2DailyWage As Decimal = emp2TotalHours * emp2HourlyRate + emp2HourlyRate * emp2OvertimeRate tbTuesday2.Text = FormatCurrency(emp2DailyWage) emp2CurrentWeekWage += emp2DailyWage tbWagesPW2.Text = FormatCurrency(emp2CurrentWeekWage) lblHrsWorked2.Text = emp2TotalHours.ToString("0.00") ElseIf rbWed.Checked Then ' 员工1周三工资计算 Dim emp1DailyWage As Decimal = emp1TotalHours * emp1HourlyRate + emp1HourlyRate * emp1OvertimeRate tbWednesday1.Text = FormatCurrency(emp1DailyWage) emp1CurrentWeekWage += emp1DailyWage tbWagesPW1.Text = FormatCurrency(emp1CurrentWeekWage) lblHrsWorked1.Text = emp1TotalHours.ToString("0.00") ' 员工2同理 Dim emp2DailyWage As Decimal = emp2TotalHours * emp2HourlyRate + emp2HourlyRate * emp2OvertimeRate tbWednesday2.Text = FormatCurrency(emp2DailyWage) emp2CurrentWeekWage += emp2DailyWage tbWagesPW2.Text = FormatCurrency(emp2CurrentWeekWage) lblHrsWorked2.Text = emp2TotalHours.ToString("0.00") End If End Sub
额外说明
- 用
Decimal.TryParse替代直接CDec,可以避免用户输入非数字内容时程序崩溃,你也可以在TryParse失败时添加弹窗提示逻辑 - 工时显示用
ToString("0.00")格式化两位小数,更符合日常展示习惯 - 原代码中未用到的
TotalHour1到TotalHour14变量,可后续根据实际业务需求调整使用逻辑
备注:内容来源于stack exchange,提问作者K3JAE
相关产品推荐
相关产品推荐

