フォームのインスタンスを作る方法として次の4つの方法がある(それ以上あるかも?)とします。 Dim Frm1 As Form Frm1 = New Form 'Sub Form.New() Dim Frm2 As Form = New Form 'Sub Form.New() Dim Frm3 = New Form 'Sub Form.New() Dim Frm4 As New Form 'Sub Form.New()
一方、Integer型の配列のインスタンスを作る方法として、対比させると 次のようになると思います。 Dim Int41 As Integer() Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer() Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer() Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer() Dim Int44 As New Integer() 'Sub Integer.New()
> Dim Int42() As Integer = New Integer() {1, 2, 3, 4, 5} 'Integer() こちらの括弧は引数指定のためのものではなく、配列宣言を意味します。
> Dim Int41 As Integer() > Int41 = New Integer() {1, 2, 3, 4, 5} 'Integer() この丸括弧も、配列宣言のためのものですね。 Int42 と同様、宣言部と配列初期化子を組み合わせて Dim Int41 As Integer() = New Integer() {1, 2, 3, 4, 5} とも書けます。
> Dim Int43 = New Integer() {1, 2, 3, 4, 5} 'Integer() > Dim Int44 As New Integer() 'Sub Integer.New() 前者の丸括弧は「配列」のためのものです。※配列初期化子 後者の丸括弧は「引数」のためのものです。※構造体の既定のコンストラクタ
先の Form 宣言と対応する形で並べれば、 Dim Frm4 As New Form() 'Form クラスの引数0個のコンストラクタ呼出 Dim Int44 As New Integer() 'Integer 構造体の既定のコンストラクタ呼出 となります。どちらも引数指定です。
引数 0 個の場合、丸括弧を省略できますので、 'Dim Int44 As New Integer() Dim Int44 As New Integer とするのは OK ですが、配列宣言の括弧を省略すると意味が変わってくるため Int41〜Int43 については丸括弧が必須です。
Dim Int44 As New Integer() ↓ Dim Int44 As Integer = New Integer() ↓ Dim Int44 As Integer = 0
' これらの括弧は省略できない Int46 = New Integer(4) {} Int46 = New Integer(4) {1, 2, 3, 4, 5} Int46 = New Integer(0 To 4) {} Int46 = New Integer(0 To 4) {1, 2, 3, 4, 5} Int49 = New Integer(0 To -1) {} Int49 = New Integer(-1) {} Int49 = New Integer() {}
そして Dim Int43 = New Integer() {1, 2, 3, 4, 5} を Dim Int43 As New Integer() {1, 2, 3, 4, 5} と記述できない理由は、『New Integer()』の時点で、 配列ではなく「コンストラクタの指定」と見做されるためです。
質問の答えとしては、 Dim Int42() As New Integer() と書けない理由は、New の丸括弧と配列の丸括弧が同居すると、 意味が曖昧になるという理由によって禁止されているためです。 だけで、済むところを、凄い労力をかけて懇切丁寧に、記載して頂き、ありがとうございます。理解できていなかったものばかりでとても勉強になります。