了解任务/比较vb.net

时间:2013-01-21 19:23:47

标签: vb.net comparison-operators

这是我第一次使用Stack Overflow,我试图理解在这段代码的最后一行中'='的含义:

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)

欢迎任何形式的帮助,谢谢!

3 个答案:

答案 0 :(得分:12)

等号(=)用于VB.NET中两个完全不同的运算符。它用作赋值运算符以及相等测试运算符。角色评估的运算符取决于上下文。所以,例如,在这个例子中:

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

您可能会认为,与其他语言(如C#)一样,执行该代码后,xyz都将等于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

答案 1 :(得分: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)

此处的=符号再次进行比较,因此,如果label3label相同,则代码将等同于Me.semandas2.Item(True)。这看起来很奇怪。

总的来说,这段代码没有多大意义,如果它编译了,我会感到惊讶,因为它试图为字典分配一个布尔值。它当然不会与Option Strict On编译。

答案 2 :(得分: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;
    }