VB.NET中的奇怪案例声明=

时间:2011-04-06 20:54:57

标签: .net vb.net

在我们的一个类中找到此代码,但我不理解第一个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

6 个答案:

答案 0 :(得分:5)

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

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

True的整数值为-1,因此i = 1永远不会等于i。无论i的值如何,都不会使用该案例。

答案 1 :(得分:4)

简而言之,代码正在有效地执行以下操作

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

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

  1. Case expr1 to expr2
  2. 案例是comparisonOp expr
  3. Case expr
  4. 此示例是Case运算符的第3个版本。隐式编译器将为testExpr = expr语句计算表达式Case。在这种情况下(哈哈),它出现在i = (i = 1)

    注意:运行条件时,实际上会将其计算为false,因此将运行else块。之所以表达式实际上被评估为

    i = CInt(i = 1)

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

答案 2 :(得分:1)

使用Option Strict,您将看到编译错误 上面发布的代码隐式转换为整数到布尔&结果将是False

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

if 1 = (true) then

答案 3 :(得分:-1)

耸肩我们的原因不是为什么,我们只是为了简化。

Return True

答案 4 :(得分:-1)

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

这里进一步讨论:vb = operator

答案 5 :(得分:-1)

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

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