web-dev-qa-db-ja.com

VB.NETでの文字列配列の宣言と初期化

関数から文字列の配列を返そうとしていて、エラーに驚いた。

私はこれが機能すると予想していましたが、エラーが発生します:

Public Function TestError() As String()
    Return {"foo", "bar"}
End Function

これは動作します:

Public Function TestOK() As String()
    Dim ar As String() = {"foo", "bar"}
    Return ar
End Function

同様に:

Public Function TestOK() As String()
    Return New String() {"foo", "bar"}
End Function

{}の意味が不明だと思います-文字列配列を明示的に作成および初期化せずに暗黙的に返す方法はありますか?

38
chris

型推論の配列初期化子のサポートは、Visual Basic 10とVisual Basic 9で変更されました。

以前のバージョンのVBでは、配列を示すために空の括弧を配置する必要がありました。また、特に明記しない限り、配列をオブジェクト配列として定義します。

' Integer array
Dim i as Integer() = {1, 2, 3, 4} 

' Object array
Dim o() = {1, 2, 3} 

詳細を確認してください:

Visual Basic 2010の重大な変更

Visual Basic 2010のコレクションおよび配列初期化子

36
pirho
_Public Function TestError() As String()
     Return {"foo", "bar"}
End Function
_

私にとってはうまく機能し、あなたのために働くはずですが、あなたのプロジェクトで暗黙的な宣言の使用を許可する必要があるかもしれません。これは、プログラム設定の[コンパイル]セクションで[厳密なオプション]をオフにしていると思います。

VS 2008(VB.NET 9.0)を使用しているため、新しいインスタンスの作成を宣言する必要があります

New String() {"foo", "Bar"}

14
msarchet

これが機能するためには "Option Infer On" を指定する必要があると思います。

Option Inferを使用すると、コンパイラはコードが何を表しているかを推測できるため、{"stuff"}は文字列の配列であると推測されます。 「Option Infer Off」を使用すると、{"stuff"}にはタイプeverが割り当てられないため、タイプ指定子なしで常に失敗します。

Option Inferは、Ithink新しいプロジェクトではデフォルトでオンですが、以前のフレームワークから3.5まで移行するとデフォルトでオフになります。

オピニオン着信:

また、あなたは "Option Explicit Off" を持っていると言います。 くださいこれをしないでください。

「Option Explicit Off」を設定すると、変数を宣言する必要がなくなります。これは、次のコードが変数「Y」を暗黙のうちに目に見えないように作成することを意味します。

Dim X as Integer
Y = 3

これは恐ろしく、怒っており、間違っています。タイプミスをすると変数を作成します。私は彼らが言語からそれを削除することを望み続けます。

6
Frosty840