【问题标题】:Yes/No message box always returns yes - VB.Net是/否消息框总是返回是 - VB.Net
【发布时间】:2017-12-25 20:12:13
【问题描述】:

我正在尝试使用消息框,并尝试了一个简单的是/否消息框 所以我写了这段简单的代码。但是,无论我按什么按钮,“chc”变量总是返回 1。我提供了代码,所以你可能会看到我做错了什么。这可能是非常错误的。

If MsgBoxResult.Yes Then
    chc = 1
ElseIf MsgBoxResult.No Then
    chc = 0
End If

MsgBox(chc)

【问题讨论】:

  • 您正在将枚举常量 Yes 和 No 与任何东西进行比较,因为 Yes 的计算结果为 6,它始终为 true。请显示更多您的代码

标签: .net vb.net variables msgbox


【解决方案1】:

MsgBox()方法正在返回MsgboxResultEnumeration,检查该方法返回的值:

Public Sub MsgBoxExample()
    Dim result As MsgBoxResult = Nothing
    Dim chc As Integer

    result = MsgBox("click something...", vbYesNo, "example")
    If result = MsgBoxResult.Yes Then
        chc = 1
    ElseIf result = MsgBoxResult.No Then
        chc = 0
    End If
    MsgBox(chc)
End Sub

【讨论】:

  • 完美运行。谢谢。
【解决方案2】:

开启严格编译。

  • 您可以通过将Option Strict On 放在文件顶部来对文件执行此操作。
  • 您可以在项目属性 > 编译 > 编译选项中为项目执行此操作,将 Option strict 设置为 On。
  • 在“工具”>“选项”>“项目和解决方案”>“VB 默认值”中将其设为所有项目的默认值。

真的,去做吧。这是在各种错误发生之前捕获各种错误的最简单、最快捷的方法之一。您可能会恢复数小时的生活。我没有夸大其词。

关闭严格编译后,编译器会看到:

If MsgBoxResult.Yes Then

然后说,'If/then 检查一个条件是真还是假。 MsgBoxResult.Yes 不是布尔值 - 它是一个整数。但我会转换它,并说除零以外的任何东西都是真的。'

问题是MsgBoxResult 的所有值都不为零。所以即使MsgBoxResult.No 也是“真实的”。

使用Option Strict On,你会得到这个编译器错误:

Option Strict On 不允许从 'MsgBoxResult' 到 'Boolean' 的隐式转换。

当你看到它时,你就会意识到你的意思

If result = MsgBoxResult.Yes Then

你会在运行程序之前修复它。

编译器错误优于运行时错误,因为您不必调试代码即可找出问题所在,或者更糟糕的是,让用户报告它然后必须找出问题所在.我们都会犯一些小错误,编译器会立即捕捉到它们。

当您打开严格编译时,您可能会看到大量其他错误。每一个都可能导致运行时错误。

关闭严格编译允许我们做各种邪恶的事情,比如

Private Sub WhatDoesThisDo(x As String, y As Integer, z As TriState)
    If x And y And z Then
        'do something
    End If
End Sub

那么如果你调用

`WhatDoesThisDo("x", 0, TriState.UseDefault)`

你得到一个运行时错误,

System.InvalidCastException: '从字符串 "x" 到类型 'Long' 的转换无效。'

这就像拥有一条双向高速公路,而不是让汽车四处行驶并希望它们不会相互碰撞。不能保证防止事故发生,但可以消除巨大的潜在原因。

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 2020-12-09
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2019-11-17
    相关资源
    最近更新 更多