Подтвердить что ты не робот

Неявно типизированные массивы: почему мы не можем явно задать размер массива?

Спецификация языка С# (7.6.10.4) говорит о том, что существуют порожденные деревьями выражения создания массива:

новый не-массив-тип [выражение-список] rank-specificiersopt array-initializeropt
новый массив-инициализатор массива массива
новый инициализатор массива-спецификатора

Третий предназначен для неявно типизированных массивов:

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

Вопрос: есть ли веская причина запретить задавать размер массива явно в случае неявно типизированного массива?

Похоже на асимметричное поведение по сравнению с этим синтаксисом:

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

Обновление.

Немного разъяснений. Единственное преимущество для комбинации явно заданного размера массива и инициализатора массива, которое я вижу, - это проверка времени компиляции для длины инициализатора. Если я объявил массив из трех int s, инициализатор должен содержать три int s.

Я думаю, одно и то же преимущество верно для неявно типизированных массивов. Конечно, использовать это преимущество или не использовать - это личное предпочтение.

4b9b3361

Ответ 2

Я думаю, что одно отличие здесь заключается в том, что этот синтаксис можно рассматривать как сначала создание типизированного массива, а затем его заполнение:

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] и заполняет его. Второй и третий операторы создают List<string> или Dictionary<string, string> и заполняют их.

Но если вы это сделаете:

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

это не одно и то же. Нет такого типа данных, как [3], поэтому, в отличие от других 2 примеров, это не случай, когда нужно сначала создать конкретный объект и заполнить его. Это специальный синтаксис для создания неявно типизированных массивов, где массив и его содержимое выводятся из содержимого фигурных скобок и затем создаются.

Я не знаю достаточно сказать, почему такой синтаксис не должен существовать, но я думаю, что это правдоподобное объяснение того, что вы видите как асимметрию.