2013-01-21 97 views
3

這是我第一次堆棧溢出,我試圖瞭解「=」意味着該代碼的最後一行:理解分配/比較vb.net

Dim label As Label = Me.labels.Item(String.Concat(New Object() { movimiento.Sector1.ID, "-", movimiento.X1, "-", movimiento.Y1 })) 
Dim dictionary As Dictionary(Of Label, Integer) 
Dim label3 As Label 
dictionary = Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1) 

任何形式的幫助將是歡迎,提前致謝!

回答

0

非常感謝,大家。片段是反編譯dll的結果。我試圖幫助一個合作伙伴。

.Net反射器基於VB.Net代碼反編譯,這是一個錯誤。 最後,我們看到,首先應該使用反編譯的C#代碼,給出了一個完整的不同含義代碼:

if (movimiento.Contenedor.Demanda2) 
    { 
     Dictionary<Label, int> dictionary; 
     Label label3; 
     (dictionary = this.demandas2)[label3 = label] = dictionary[label3] - 1; 
     if (this.demandas2[label] == 0) 
     { 
      label.ForeColor = Color.Black; 
     } 
     (dictionary = this.demandas2)[label3 = label2] = dictionary[label3] + 1; 
     label2.ForeColor = Color.DarkOrange; 
    } 
1

讓我們來看看在這行代碼:

dictionary = Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1) 

第一=是一個賦值。所以我們將正確的部分分配給字典。現在的右側部分:

Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1) 

兩個表達式之間的=是一個比較,所以它返回一個布爾值。所以假定的「字典」被分配一個布爾值。如果我們檢查表達式的左側部分:

Me.demandas2.Item(label3 = label) 

再次,這裏的=標誌是做一個比較,所以如果label3相同label,那麼代碼就等於Me.semandas2.Item(True)。這似乎很奇怪。

總的來說,這段代碼並沒有什麼意義,如果它編譯了,我會感到驚訝,因爲它試圖將一個布爾值賦給字典。它當然不會與Option Strict On編譯。

+0

+1'這個代碼並沒有太大的sense'。試圖研究錯誤代碼的良好實踐被認爲是一種糟糕的做法。 – Neolisk

12

等號(=)用於VB.NET中兩個完全不同的運算符。它被用作賦值運算符以及相等測試運算符。角色評估的運營商取決於上下文。所以,舉例來說,在這個例子:

Dim x As Integer = 1 
Dim y As Integer = 2 
Dim z As Integer = x = y 

你可能會認爲,在其他語言,如C#,即執行該代碼,xy,並且z後都會等於2。但是,VB將第二個等號視爲平等測試運算符。因此,實際上,它這樣做:

If x = y Then 
    z = True 
Else 
    z = False 
End If 

你會發現,雖然,我們正在努力,然後指定一個布爾值整數變量。如果你有Option Strict On(你應該),它不會允許你這樣做。如果這是真的,你想要做什麼,它會迫使你把它轉換爲一個整數,這使得它略微更明顯:

z = CInt(x = y) 

但是,它仍然混亂,所以通常情況下,這種事情是氣餒VB.NET。所以,我懷疑你發佈的代碼甚至不會編譯,如果Option Strict被打開。但是,這是它實際上試圖做的事情:

Dim temp1 As Boolean = (label3 = label) ' Evaluates to False 
Dim temp2 As Boolean = (Me.demandas2.Item(temp1) = (dictionary.Item(label3) - 1)) ' Likely evaluates to False 
dictionary = temp2 ' Couldn't possibly be a valid assignment