6

割り当てを行ったときの戻り値は何ですか?

たとえば、これはできますか?(つまり、割り当ては割り当てられている値を返します)

Dim a As Integer = 1
Dim b As Integer = 2
a = b = 3

今日、このコードを書いたときに疑問が生じました。

Dim updates = GetUpdates()
While updates.Count > 0
    Foo.ApplyUpdates(updates)
    updates = GetUpdates()
End While

こんな風に書けばよかったのに…

While (updates = GetUpdates).Count > 0
    Foo.ApplyUpdates(updates)
End While

私はそれがきれいではないことを知っています...(そして私はまったく宣言しupdatesたことがありません)が、.NETで割り当てがどのように機能するかについて興味がありました...それは戻り値を持つ関数ですか?もしそうなら...それは何を返しますか?

編集

コードの最初のチャンクを試してみました。コンパイラは、b と 3 を比較した結果を a に代入すると解釈しているようです... もちろん、これはコンパイラ エラーです。

そして、2 番目のコード チャンクについては、=型が何であれ、演算子が定義されていないupdatesことがわかります。つまり、代入ではなく比較だと考えています。

私の質問に追加すると、なぜこのように機能するのですか? vb.net=が 2 つの意味 (代入と比較) でシンボルをオーバーロードしているからですか?

4

2 に答える 2

9

.NETで割り当てがどのように機能するかについて。

これは実際には、.NETではなくVBで割り当てがどのように機能するかについてです。

これはVB.Netでは機能しません。VB.Netの=演算子は、単に「右側の値を左側の変数またはプロパティに割り当てる」だけです。

割り当てを行うときの戻り値は何ですか?

上記のステートメントに見られるように、代入演算子はVB.Netに値を返しません

これは他の.NET言語とは異なることに注意してください。たとえば、C#では、代入=演算子はあなたが説明していることを実行し、「右側のオペランドの値を、左側のオペランドで示される格納場所、プロパティ、またはインデクサーに格納し、その値を結果。」

Dim a As Integer
Dim b As Integer
a = b = 3

指定すると、これは実際にはエラーになることに注意してOption Strictください。「Option Strict Onは、「ブール値」から「整数」への暗黙の変換を許可しません。」

これは、VB.Netがこれを2つの操作と見なしているためです。つまり、基本的に次のことを実行しようとしています。

Dim a As Integer
Dim b As Integer

Dim temp as Boolean
temp = (b = 3)
a = temp

それで、私の質問に追加するために、なぜそれがこのように機能するのですか?vb.netがシンボル=を2つの意味(代入と比較)でオーバーロードしているからですか?

まあ、それは言語が設計された方法です。ただし、あなたは正しいと思います。同じ演算子(=)が割り当てとして使用されているため、VBがこのように作成されたのは比較です。ただし、元のVB言語はこの方法であり、VB.Netの構文を同じ(または可能な限り近い)に保つために、この動作が引き継がれたのではないかと思います。

于 2012-08-22T21:23:15.503 に答える
4

Visual Basicではa = b = 3、多少予期しないことになります。VBには==演算子がなく、代わりに=割り当てと等価比較の両方に使用されるため、上記の式は次のようになります。

If b = 3 Then
    a = True
Else
    a = False
End If
于 2012-08-22T21:22:41.733 に答える