2011-04-06 40 views
2

在我们的一个类中找到了这段代码,但我不理解第一个case语句在做什么:“case i = 1”。我确信某人只是错误地将其从IF/ELSE语句转换而来,但为什么VB.NET允许这种语法。这是什么意思?VB.NET中的奇怪案例陈述=

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

这很奇怪。我猜想用“return true”替换它。 – asawyer 2011-04-06 20:56:49

+0

asawyer,当然这不是真正的代码。这是我的代码jist的简化版本。并不是真正想要如何改写它。试图理解这种书写方式的含义。 – Denis 2011-04-06 21:00:50

+0

我不知道在源代码控制中,并询问谁检查了它?就目前而言,它根本没有多少意义。 – asawyer 2011-04-06 21:01:56

回答

4

在短码被有效地做在下面的

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

Case表达一个VB.Net Select .. Case声明有三种不同的形式。

  1. 案例EXPR1要表达式2
  2. 情况comparisonOp EXPR
  3. 案例EXPR

这个例子是Case运营商的第3版本。隐式地,编译器将为Case语句评估表达式testExpr = expr。在这种情况下,(哈哈),它出来到i = (i = 1)

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

i = CInt(i = 1)

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

+0

是的,看起来这种行为是一样的,但你是如何得到这个的?你是如何到达(我=真)? – Denis 2011-04-06 21:08:21

+0

@Denis用更详细的信息更新了 – JaredPar 2011-04-06 21:10:08

+0

谢谢。我很感激。你有一个很好的解释。希望我可以将两者都标为答案。 – Denis 2011-04-06 21:26:50

-1

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

Return True 
+0

安迪,当然这不是真正的代码。这是我的代码jist的简化版本。并不是真正想要如何改写它。试图理解这种书写方式的含义。 – Denis 2011-04-06 21:01:09

+0

实际上代码返回'False'不是'True' – JaredPar 2011-04-06 21:11:16

-1

我认为=是在VB的过载操作者

它进一步论述:vb = operator

+0

你是什么意思?这是一个直接的比较测试,我是否等于1。 – asawyer 2011-04-06 21:00:01

+1

你会认为它实际上返回True,但它不。运行。 – Denis 2011-04-06 21:05:32

5

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

表达i = 1将被评估,以任一TrueFalse,然后将其转换为一个整数值,并与i

整数值True-1,所以i = 1永远不会等于i。无论i的值如何,该情况都不会被使用。

+0

i = 1将为真,但CInt(真)= -1。如果我将我的声明更改为“Dim i as Integer = -1”,那么根据您的解释,它应该返回True。它没有。 – Denis 2011-04-06 21:13:18

+0

好的,看着修改后的解释。所以我跟着你,“True的整数值是-1”,但是我失去了你,“所以i = 1永远不会等于i”。这是为什么? – Denis 2011-04-06 21:16:41

+1

@Denis:如果'i'是'-1',那么表达式'i = 1'就是'False',它被转换为'0',所以它不等于'i'。对于'i',没有任何值等于'i = 1'。 – Guffa 2011-04-06 21:18:33

1

使用Option Strict,您将看到编译错误。
上面贴出的代码确实是从整数到布尔值的隐式转换&结果将是False

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

if 1 = (true) then

+0

使用Option Strict On没有编译错误。 – Denis 2011-04-06 21:23:01

+0

只需添加到上面: – Denis 2011-04-06 21:33:58

+0

只需添加到上面:1 = CInt(真),其产生1 = -1这是错误的,因此将被跳过。 – Denis 2011-04-06 21:45:04

-1

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

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