【问题标题】:Strange Case Statement in VB.NET with =VB.NET 中带有 = 的奇怪案例语句
【发布时间】:2011-04-06 20:54:57
【问题描述】:

在我们的一个类中找到了这段代码,但我不明白第一个 case 语句在做什么:“Case i = 1”。我确信有人只是从 IF/ELSE 语句中错误地转换了它,但为什么 VB.NET 允许这种语法。这样写是什么意思?

    Dim i As Integer = 1
    Select Case i
        Case i = 1
            Return True
        Case Else
            Return False
    End Select

【问题讨论】:

  • 这很奇怪。我猜用“return true”替换它。
  • asawyer,当然这不是真正的代码。这是我的代码 jist 的简化版本。不是真的在寻找如何重写它。希望了解以这种方式编写时的含义。
  • 将 Option Strict On 放在文件顶部以捕获此类错误。现在您在该代码上得到了一个很好的编译器错误。
  • 仅供参考,Option Strict 认为这不是编译错误。
  • @Denis 它应该。 Option Strict On 不允许从 BooleanInteger 的隐式转换,这将导致 Case i = 1 非法。我已经在 VS2010 中验证了这一点

标签: .net vb.net


【解决方案1】:

Case 语句可以采用任何可隐式转换为Select 语句中值类型的表达式。

表达式i = 1 将被评估为TrueFalse,然后将其转换为整数值并与i 进行比较。

True 的整数值为-1,所以i = 1 永远不会等于i。无论i 的值如何,都不会使用大小写。

【讨论】:

  • i = 1 为真,但 CInt(True) = -1。如果我将 i 的声明更改为“Dim i as Integer = -1”,那么根据您的解释,它应该返回 True。它没有。
  • 好的,看修改后的解释。所以我跟着你到“True 的整数值为 -1”,但我在“所以 i = 1 永远不会等于 i”时失去了你。这是为什么呢?
  • @Denis:如果i-1,那么表达式i = 1就是False,转换成0,所以不等于ii 没有值,它将等于 i = 1
  • 谢谢,我想了想,这绝对是有道理的。
【解决方案2】:

简而言之,代码实际上是在执行以下操作

If i = (i = 1) Then
  Return True
Else
  Return False
End If

VB.Net Select .. Case 语句中的Case 表达式有3 种不同的形式。

  1. 案例 expr1 到 expr2
  2. Case Is compareOp expr
  3. 案例表达

这个例子是Case 操作符的第三个版本。编译器将隐含地为该 Case 语句计算表达式 testExpr = expr。在这种情况下(哈哈)它出现在i = (i = 1)

注意:运行时,条件实际上将评估为 false,因此将运行 else 块。为什么是表达式实际上被评估为

i = CInt(i = 1)

i = 1 部分将评估为 True,并且由于 VB6(和 COM 的 TRUE 版本)的遗留原因,CInt(True) 部分将评估为 -1,因此比较将失败。

【讨论】:

  • 是的,看起来这种行为是一样的,但你是怎么做到的?您是如何得出 (i = True) 的?
  • 谢谢。我很感激。你有一个很好的解释。希望我能将两者都标记为答案。
  • @Denis 很高兴我能提供帮助。说实话,我不得不查看这个,我曾经在 VB.Net 编译器上工作。语言的棘手部分。
【解决方案3】:

使用Option Strict,你会看到编译错误。
上面发布的代码执行从整数到布尔值的隐式转换,结果将是False

编辑:您的代码将变为
if 1 = (i = 1) then

if 1 = (true) then

【讨论】:

  • 只是添加到上面: 1 = CInt(True) 产生 1 = -1 这是错误的,所以情况将被跳过。
【解决方案4】:

耸耸肩我们的不是推理,我们的只是简化。

Return True

【讨论】:

  • 安迪,这当然不是真正的代码。这是我的代码 jist 的简化版本。不是真的在寻找如何重写它。希望了解以这种方式编写时的含义。
【解决方案5】:

我认为=是vb中的重载运算符

这里进一步讨论:vb = operator

【讨论】:

  • 什么意思?这是一个直接比较测试,i是否等于1。
  • 您会认为它实际上返回 True,但事实并非如此。运行它。
【解决方案6】:

这可能是一个错误。应该是,

Dim i As Integer = 1
 Select Case True
     Case i = 1
         Return True
     Case Else
         Return False
 End Select 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多