読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

文字列への暗黙的な型変換( VB9 編)

VB(.NET)

他の言語から来るとはまりそうな話ですね。
まぁ、文字列連結の "+" (結合演算子)の動きを考えると、これでいいのかも、とは思うのですが、何とも気持ちの悪い動きです。
……で、ふとなく気になったので、似た様な事を VB 9.0 でも試してみました。
(追記)以下の話は Option Strict Off の場合についてです。 On にした場合は s1 と s4 以外はコンパイルエラーとなります。 s1 と s4 については実行結果は変わりません。

Dim s1 As String = 1 + 2 + 3 + 4.4 + 5.5 & ""
Console.WriteLine(s1)
Dim s2 As String = 1 + 2 + "3" + 4.4 + 5.5 & ""
Console.WriteLine(s2)
Dim s3 As String = "1" + 2 + 3 + 4.4 + 5.5
Console.WriteLine(s3)

あえて全部 "+" でつなげました。( s1 と s2 は、諸事情により最後だけ "&" で連結)
これの実行結果は、以下。

15.9
15.9
15.9

VB の場合、数字文字列を "+" でつなぐと暗黙的に数値変換されるんですね。(この仕様を忘れて、結果に軽く驚いたのは秘密です)
ちなみに、これをちょっと変えてあげると違う結果が返ってきます。

Dim s4 As String = 1 + 2 & "3" & 4.4 + 5.5
Console.WriteLine(s4)
Dim s5 As String = "1" & 2 + 3 + 4.4 + 5.5
Console.WriteLine(s5)

数字文字列の前後の結合演算子を "+" から "&" に変更してみました。
こうした場合、実行結果は以下の様になります。

339.9
114.9

どうやら VB では "&" の前後を計算した上で文字連結している様です。
VB の "&" は評価順が低いって事なのかな?
もうひとつ、おまけ。

Dim s6 As String = 1 + 2 & "3" + 4.4 + 5.5
Console.WriteLine(s6)
Dim s7 As String = 1 + 2 + "3" & 4.4 + 5.5
Console.WriteLine(s7)

左右の結合演算子を片方だけ "&" にしてみました。
実行結果は以下。

312.9
69.9

この結果を見る限り、 "&" は最後に評価されている様ですね。( C# 脳で見るともう何がなんだか。。。)