【问题标题】:VB 'Option Strict' issue with conversion from double to long从 double 转换为 long 的 VB 'Option Strict' 问题
【发布时间】:2020-09-19 01:31:38
【问题描述】:

我刚开始使用 VB,不得不将“Option Strict”切换为开启。我的代码中出现此错误,提示“Option Strict On 不允许从 'double 到 long' 的隐式转换。”我知道这是什么意思,但我和我的朋友似乎无法解决这个问题。

错误:“Option Strict 不允许将第 24 行的 value1 和 value 2 从 'Double' 隐式转换为 'Long'。(Private Sub btnIntDiv_Click)

代码如下:

Public Class frmMathCalculator
    Dim value1 As Double
    Dim value2 As Double
    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        value1 = Integer.Parse(txtValue1.Text)
        value2 = Integer.Parse(txtValue2.Text)
        Dim addResult As Double = value1 + value2
        lstAnswer.Items.Add(addResult)
    End Sub
    Private Sub btnSubtract_Click(sender As Object, e As EventArgs) Handles btnSubtract.Click
        Dim subtractResults As Double = value1 - value2
        lstAnswer.Items.Add(subtractResults)
    End Sub
    Private Sub btnMultiply_Click(sender As Object, e As EventArgs) Handles btnMultiply.Click
        Dim multiplyResults As Double = value1 * value2
        lstAnswer.Items.Add(multiplyResults)
    End Sub
    Private Sub btnLongDiv_Click(sender As Object, e As EventArgs) Handles btnLongDiv.Click
        Dim divideResults As Double = value1 / value2
        lstAnswer.Items.Add(divideResults)
    End Sub
    Private Sub btnIntDiv_Click(sender As Object, e As EventArgs) Handles btnIntDiv.Click
        Dim intDivResults As Double = value1 \ value2
        lstAnswer.Items.Add(intDivResults)
    End Sub
    Private Sub btnMod_Click(sender As Object, e As EventArgs) Handles btnMod.Click
        Dim modResults As Double = value1 Mod value2
        lstAnswer.Items.Add(modResults)
    End Sub
    Private Sub btnExponent_Click(sender As Object, e As EventArgs) Handles btnExponent.Click
        Dim expResults = value1 ^ value2
        lstAnswer.Items.Add(expResults)
    End Sub
End Class

【问题讨论】:

  • 如果你使用Integer.Parse(),那你为什么将value1value2声明为Double?将它们声明为Integer,问题就会消失。或者,如果您想支持十进制数(不仅仅是整数),请使用 Double.Parse() 并将 value1 \ value2 替换为 CInt(value1 / value2)
  • 此外,在处理用户输入时应避免使用.Parse() 方法。考虑改用.TryParse()

标签: vb.net


【解决方案1】:

考虑:

Public Class frmMathCalculator

    Private value1 As Double 'we typically specify access levels like public or private for variables declared inside a class
    Private value2 As Double

    'We need to do this often, so rather than repeat the parsing in every 
    'Button click handler we create a sub we can call 
    Private Sub ParseUserInput()

        'TODO: switch these to TryParse and provide user feedback if input is bad
        'TODO: make this sub a function that returns a Boolean and return false if input is bad
        value1 = Double.Parse(txtValue1.Text) 'value1 is a double, so use double.parse not int.parse
        value2 = Double.Parse(txtValue2.Text)
    End Sub

    Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        
        ParseUserInput() 'set our value variables 

        'VB will be able to work out that double + double is double so can skip the "As Double" bit
        Dim addResult = value1 + value2

        'List.Items.Add takes an object, and the list will simply call ToString on it when it wants
        ' to display it. For a double this is fine unless we want to format it - more on this later 
        lstAnswer.Items.Add(addResult)
    End Sub

我还没有完成所有这些,但模式是可重复的..

这最终是对精确度和了解数据类型的练习。函数接受某种类型的变量并发出具有某种类型的数据,可能不同。您需要保持一致性,并且通常始终注意将哪些类型的数据放在哪里

Double.Parse 接受一个字符串,返回一个双精度。 Double+Double 导致双倍。 ListBox.Items.Add 接收一个对象(不返回任何内容,但某些集合添加方法会返回一些您可能会捕获和使用的内容),因此您可以放入任何您喜欢的内容,但重要的是要意识到它必须是一个字符串.为了实现这一点,如果您没有告诉 List 显示项目的特定属性的内容,那么 list 将盲目地在您放入的对象上调用 ToString。对于双精度,这很好 - 它只需要 @987654322 @double 并使它成为一个字符串 "1.234" 看起来相同。但是,如果您创建了一些像 Person 这样的自定义类,但您没有提供 ToString 的专门变体,例如返回名字和姓氏,那么您将在列表中看到的只是“MyNamespace.Person”一遍又一遍.这是因为默认情况下 ToString 只返回对象类型的名称。

假设在这种情况下,我们一直想将双打格式化为 3dp。我们可以格式化一个字符串并将其放入:list.Items.Add(aDouble.ToString("0.000"))

那么,使用哪个以及为什么?如果您只是使用此列表来保存结果,请格式化字符串。您甚至可以将全部金额放入:list.Items.Add($"{value1} + {value2} = {result:0.000} (to 3dp)")

如果您打算将这些数字从列表中移出并稍后对它们进行处理,请将它们保留为双精度数

如果您想稍后将它们取出并对其进行自定义表示,则需要将它们添加为自己的自定义对象,该对象知道值但可以在询问时呈现自定义表示。现在可能有点高级


选项严格关闭 VB 非常(过度)宽容;如果您尝试将字符串放入需要双精度的内容中,它会尝试为您将字符串转换为双精度。这也许很好,但它不会鼓励程序员的严格心态——最终它会出错。注意细节及其类型,并且明确,是避免将来出现细微错误的好方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2021-12-03
    相关资源
    最近更新 更多