4

这是我第一次在 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)

欢迎任何形式的帮助,在此先感谢!

4

3 回答 3

16

等号 ( =) 用于 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
于 2013-01-21T19:55:44.980 回答
2

我们来看看这行代码:

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.

于 2013-01-21T19:48:00.033 回答
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;
    }
于 2013-02-05T20:38:03.810 回答