是/否消息框始终返回yes - VB.Net

问题描述 投票:2回答:2

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

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

MsgBox(chc)
.net vb.net variables msgbox
2个回答
5
投票

MsgBox()方法返回MsgboxResult Enumeration,检查方法返回的值:

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

1
投票

打开严格的编译。

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

真的,做吧。如果能够在发生之前捕获各种错误,最简单,最快捷的方法就是其中之一。你可能会得到几个小时的生命。我并不夸张。

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

If MsgBoxResult.Yes 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'无效。

这就像拥有一条双向高速公路,而不是让汽车在整个地方开车,并希望它们不会互相撞击。它不能保证能够预防事故,但它消除了巨大的潜在原因。

© www.soinside.com 2019 - 2024. All rights reserved.