2011-04-06 81 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