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の2つのまったく異なる演算子に使用されます。これは、代入演算子としてだけでなく、等価性テスト演算子としても使用されます。キャラクターが評価する演算子は、コンテキストによって異なります。したがって、たとえば、この例では次のようになります。

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

C#などの他の言語と同様に、そのコードを実行した後は、、、およびすべてが。に等しくなると考えるかもxしれyませz2。ただし、VBは2番目の等号を等号演算子として扱います。したがって、実際には、これを実行しています。

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)

1つ目=は課題です。したがって、適切な部分を辞書に割り当てます。さて、正しい部分について:

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

2つの式の=間は比較であるため、ブール値を返します。したがって、想定される「辞書」にはブール値が割り当てられます。その式の左側を確認すると、次のようになります。

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 に答える