2013-01-21 68 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