13

C# 言語仕様 (7.6.10.4) によると、ツリー型の配列作成式があります。

new non-array-type [ expression-list ] rank-specifiersopt array-initializeropt
new array-type array-initializer
new rank-specifier array-initializer

3 つ目は、暗黙的に型指定された配列を対象としています。

var foo = new[] { 1, 2, 3 };

質問: 暗黙的に型指定された配列の場合に、配列サイズを明示的に設定することを禁止する重要な理由はありますか?

次の構文と比較すると、非対称の動作のように見えます。

var foo = new int[3] { 1, 2, 3 };

更新します

少し明確にします。私が見ることができる明示的に設定された配列サイズと配列初期化子の組み合わせの唯一の利点は、初期化子の長さのコンパイル時のチェックです。3 つの の配列を宣言した場合int、初期化子には 3 つの が含まれている必要がありますint

暗黙的に型指定された配列にも同じ利点があると思います。もちろん、この利点を利用するかしないかは個人の好みです。

4

2 に答える 2

0

ここでの違いの 1 つは、この構文が最初に型付き配列を作成し、次にそれを入力するように見えることだと思います。

var foo = new int[3] { 1, 2, 3 };

これは、単一のステートメントで他のデータ型を宣言および初期化する方法に似ています。

var list = new List<string>{ "a", "b", "c" };
var dict = new Dictionary<string, string>{ {"a", "b"}, {"c", "d"} };

最初のステートメントは、それを作成しint[3]、移入します。2 番目と 3 番目のステートメントはList<string>orDictionary<string, string>を作成し、それらに値を設定します。

しかし、これを行うと:

var foo = new[3] { 1, 2, 3 };

これは同じことではありません。のようなデータ型は存在しない[3]ため、他の 2 つの例とは異なり、これは最初に特定のオブジェクトを作成してデータを入力するケースではありません。これは、暗黙的に型指定された配列を作成するための特別な構文です。配列とその内容は、中かっこの内容から推測されてから作成されます。

なぜそのような構文が存在してはならないのか、私には十分にわかりませんが、これは非対称と見なされるもののもっともらしい説明だと思います。

于 2013-01-30T06:45:46.893 に答える