blank_page
海の向こうでは、PDC2008 が開催中で、いろいろな話題が連日飛び込んできます。
Visual Studio 2010
のプレビュー版 (CTP) も公開され、次期 VB の言語仕様の変更点もいくつか見えてきたので、ご紹介したいと思います。
まずは、VS2008 で個人的に気になっていた、配列、コレクションの初期化子と型推論について確認してみました。
VB9(2008) では、以下のような式を記述すると、コンパイラにより v1 は Integer
型として型推論されます。
Dim v1() = {1, 2, 3, 4, 5}
このように記述した場合の v1 は Object 型の配列として扱われてしまいます。
どうやら VB9(2008)
では、リテラル値や変数からの型推論はできても、配列の型推論はできないらしく、これは、
Dim v1() = New Integer() {1, 2, 3, 4, 5}
または
Dim v1 = New Integer() {1, 2, 3, 4, 5}
と記述する必要があります。
後者の方を見ると、配列の型推論もできているように思えるのですが、これは v1 に対し明示的に Integer 型の配列を代入しているので、単純な型の代入時と同じ解釈だと思います。
とりあえずはこの例のように型が決まった配列を扱う場合は、この仕様でも十分なのですが、匿名型の配列を初期化する場合にはこれが弊害となります。
匿名型の場合、当然型名を持たないのであえて書くならば、
Dim persons = New () { _
New With {.ID = 1, .Name =
"Person1"}, _
New With {.ID = 2,
.Name = "Person2"} _
}
みたいな感じになるのでしょうか。
VB の場合、C 系言語のように配列とメソッドで使用する括弧が区別されていないので、コードパーサー上も複雑でしょうし、実際のコードを見る側としても何のこっちゃという感じですので、私の意見としては以下のような記述ができる方がより自然な形ではないのかなと思っていました。
Dim persons = { _
New With {.ID = 1, .Name =
"Person1"}, _
New With {.ID = 2,
.Name = "Person2"} _
}
さてそこで VB10(2010) ですが、今のところは、私が期待していた仕様となっているようです。
これと等価の C# のコードが
var v1 = new [] {1, 2, 3, 4, 5};
となるので、この部分の型推論については VB
の方が一歩踏み込んだようなかたちになりますが、BASIC 言語の特性上せざるをえなかったということでしょうか。
ちなみに、配列の要素を複数の型でミックスした場合のルールが現行は C#
と若干違うのですが、このあたりはまだ CTP なので、今後は統一していくのかもしれません。
(まぁ、普通こんなことはしないのでどうでもいいんだけど・・・。)
Dim v1 = {1I, 2L, 3D, 4.0F, 5.0R} '(有効)Double 型の配列として解釈される
var v1 = {1, 2L, 3m, 4.0f, 5.0d}; //(無効)十進型と浮動小数点型は混在できない
最後に、さきほどの匿名型の配列の初期化コードですが、VB10(2010) では正式には以下のように
Dim persons = {
New With {.ID = 1, .Name =
"Person1"},
New With {.ID = 2,
.Name = "Person2"}
}
なんと!VBからついに "_"(アンダースコア)が消えています!!
VB にはステップの終端文字(セミコロン)がないので、これ(コードのパース)の開発には VBTeam は相当苦労したんじゃないかなと。
限定条件があるとはいえ、これはかなりうれしいです。コードがかなり美しく見えます。つか、なにかとコードが書きやすいぞ!
それでは、今日はこんなところで。
こんなことを調べていたら、また夜中になってしまいました・・・。
また気づいたことがあったら書きます。