Как оценивается объявление типа массива new int [10] []? - PullRequest
1 голос
/ 10 февраля 2010

а) Как оценивается объявление типа массива new int[10][]? Это оценивается

как (new int[10])[]

или как (new int[10][])

или…?

б) Я не уверен, как спросить это: я знаю, что утверждение int[][] i = (new int[10])[] даст нам ошибку компилятора. Но если предположить, что компилятор не сообщит об ошибке, какой тип массива будет создан компилятором на основе этого оператора?


РЕДАКТИРОВАНИЕ:

Я прошу прощения за то, что не смог сделать мой вопрос более всеобъемлющим. Это один из тех вопросов, когда что-то беспокоит меня, и я не способен достаточно четко сформулировать вопрос, чтобы понять его. Поэтому я задаю неполные вопросы, надеясь, что ответы помогут мне в этом. В любом случае, это бессмысленный вопрос, но я все же хотел бы объяснить, что я имел в виду под этим:

что все это вызвало, была статья из MSDN, где говорилось

Первичные выражения подразделяются на выражения-создания-массива и выражения первичного-не-создания-массива. Обработка выражения-создания-массива таким способом, а не перечисление его вместе с другими простыми формами выражений, позволяет грамматике запретить потенциально запутанный код, такой как

object o = new int [3] [1];

, который иначе интерпретируется как

object o = (new int [3]) [1];

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

Или, иначе говоря, я подумал, что, возможно, компилятор следует некоторой встроенной логике (полученной из некоторого математического поля) при интерпретации синтаксиса создания / инициализации массива. Другими словами, компилятор не создал массив из-за того, что его разработчики дали ему специальную инструкцию, например «, когда вы видите слова new и name некоторого типа и две пары квадратных скобок ([] []) , затем следуйте этим пошаговым инструкциям, которые подробно расскажут вам, что делать", но вместо этого разработчики просто встраивают некоторые математические логика и тот компилятор был способен извлекать массив самостоятельно, без разработчиков, давая ему пошаговые инструкции.

Кстати - я понимаю о зубчатых и прямоугольных массивах и как они инициализируются и т. Д .;)

Ответы [ 4 ]

10 голосов
/ 10 февраля 2010

Вот моя статья о том, как это работает и каковы были соображения дизайна. Надеюсь, что это отвечает на ваши вопросы.

http://blogs.msdn.com/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

Чтобы ответить на ваши конкретные вопросы:

Как оценивается объявление типа массива "new int [10] []"?

Это не объявление типа. "class C {}" - это объявление типа, потому что оно объявляет новый тип. У вас есть выражение для создания объекта.

Он оценивается путем создания нового массива с десятью элементами. Каждый элемент является переменной, которая может содержать ссылку на массив целых чисел. Каждая из этих переменных инициализируется нулем.

Оценивается ли оно как (new int [10]) [] или как (new int [10] [])

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

Но если предположить, что компилятор не сообщит об ошибке, какой тип массива будет создан компилятором на основе этого оператора?

Если бы епископы не ограничивались движением по диагонали, как бы гамбит королевы играл по-другому?

Вопрос не дает достаточно информации, чтобы ответить на вопрос. Вы должны сказать, что такое новое правило для епископов, а не только то, какое ограничение снято. Каким будет новое правило для епископов? Как только мы узнаем новое правило, мы можем проанализировать, как меняется игра.

Вы не предложили, что спецификация скажет , только то, что она не скажет . Этого недостаточно для определения семантики этого предложенного выражения.

4 голосов
/ 10 февраля 2010

Это массив размера десять с членами целочисленного массива типа, также известного как зубчатый массив.

См. этот раздел учебника по C # для MSDN (в частности, раздел Jagged Array).

2 голосов
/ 11 февраля 2010

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

Когда компилятор видит

int[][] a = new int[10][];

что он делает, он создает одномерный массив длиной десять. Каждый элемент в этом массиве может содержать ссылку на int[]. Затем он присваивает ссылку на этот одномерный массив длиной десять a. Поэтому, если вы понимаете, что

int[] a = new int[10];

теперь вы должны быть в состоянии понять, что

int[][] a = new int[10][];

делает. Первый резервирует десять смежных слотов, которые могут вместить int. Последний резервирует десять непрерывных слотов, которые могут содержать ссылки на int[]. (Мы опускаем дополнительные детали, такие как свойство Length и т. Д.) Итак, если вы представляете себе фантазийный синтаксис ArrayCreate(Type type, int length), первый -

int[] a = ArrayCreate(typeof(int), 10);

и последний

int[][] a = ArrayCreate(typeof(int[]), 10);

Теперь я не совсем понимаю, что вы спрашиваете в ваших двух вопросах, помеченных как "а)" и "б)". Возможно, вы можете перефразировать их в терминах этого фантастического ArrayCreate синтаксиса, и я могу попытаться ответить на них?

Надеюсь, это поможет.

1 голос
/ 10 февраля 2010

Это даст вам вектор с шириной 10 целочисленных значений и неопределенной глубиной. Глубина каждого вектора будет определяться по мере создания и заполнения каждого из 10 индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...