C# では、こう
int[] hoge = new int[ 3 ];
一択じゃないですか。
VB.NET では、配列じゃない場合に、以下のコードが同じ意味になることから、
Dim hoge As New Object()
Dim hoge As Object = New Object()
配列であることを示す括弧は当然型名につくもんだと思っている俺は、こう書いたわけです。
Dim hoge As New Integer( 3 )
が、これだと、「型 'Integer' にはコンストラクタがありません」って怒られます。
3 を Integer のコンストラクタの引数と解釈するわけですね。
え? じゃあ、こう?
Dim hoge( 3 ) As New Integer
と思ったのですが、今度は「配列を 'New' で宣言することはできません」というエラー。
ここへ来て混乱の極み。
で、正解は以下のいずれかとなるんだそうです。
Dim hoge( 3 ) As Integer
Dim hoge As Integer() = New Integer( 3 ) {}
Dim hoge() As Integer = New Integer( 3 ) {}
最初のは、どこにも New がありませんが、インスタンスは既に作られていて、hoge( 0 ) = 1 のようにアクセスできます。
後の 2 つは、( 3 ) がコンストラクタの引数と解釈されるか配列の要素数と解釈されるかが、そのあとの {} の有無で変わってきます。
ちなみに、こういう書き方
Dim hoge() As Integer
Dim hoge As Integer() = New Integer() {}
も許されていて、これは要素数 0 の配列になるらしいです。
ついでに、
Dim hoge As Object()
Dim hoge As New Object()
この () の意味も、New がなければ配列宣言、New があればコンストラクタ引数と解釈されます。
このとき、1 行目の方は Nothing(C# で言う null)になります。
おさらい。
以下のコード、上の3行はどれも Integer 型の配列宣言ですが、1 行目は要素数0、2行目は要素数3の配列が作られます。3行目はNothingになって、4行目はコンパイルエラーです。
Dim hoge() As Integer
Dim hoge( 3 ) As Integer
Dim hoge As Integer()
Dim hoge As Integer( 3 )
…VB.NET 使いってすごいなぁ、と思いました。