Ответ 1
Почему я не могу использовать инициализатор массива с неявно типизированной переменной? Почему спецификация такая? В чем здесь причина?
Я не был в команде дизайнеров, когда это решение было принято, и примечания к дизайну (*) не читают эту тему. Тем не менее, я спросил кого-то, кто был в комнате в 2005 году, когда это решение было принято.
Объяснение прозаично. Команда разработчиков никогда не была очень довольна синтаксисом инициализатора массива. Честно говоря, совершенно странно, что инициализатор массива не является выражением и синтаксически может появляться только в локальном или полевом объявлении. Это усложняет парсер. Кажется странным, что
int[] x = {1};
должен быть законным, но
M({1});
нет.
Синтаксис инициализации массива также упрощает восстановление ошибок во время анализа кода во время редактирования. Предположим, у вас есть что-то вроде:
class C
{
void M()
{
{
int result = whatever();
...
}
{
int result = somethingElse();
...
}
}
}
и вы начинаете вводить новое объявление в редакторе:
void M()
{
int[] x =
{
int result = whatever();
и внезапно теперь синтаксический анализатор должен иметь дело с тем, чтобы устранить эту ситуацию так, чтобы не смутить бедного пользователя, который вот-вот наберет "null". Очевидно, что вы не собираетесь инициализировать локальную переменную блоком кода, но синтаксический анализатор совершенно в пределах своих прав сказать, что скобка может легально быть частью инициализатора массива здесь, и поэтому она является "результатом int", неожиданно.
Итак, длинный рассказ, "классические" инициализаторы массивов немного несовместимы. Мы не можем избавиться от них из-за соображений обратной совместимости. Но мы также не хотим поощрять их использование, позволяя им в большем количестве мест.
Команда разработчиков придумала идею добавления "new []" к инициализатору массива и превратила это в юридическое выражение, и теперь проблема решена. В новых областях языка нет "ползучести" классической неудачи инициализатора массива, и есть краткий, но читаемый синтаксис, в котором четко сказано "вы создаете новый массив здесь".
Мораль этой истории заключается в следующем: попробуйте сделать это правильно в первый раз, потому что синтаксис вечен.
(*) В моем поиске я обнаружил несколько интересных вещей: команда изначально считала, что "var", вероятно, не будет ключевым словом, выбранным для этой функции; по-видимому, они росли на них. Кроме того, один проект требует, чтобы локаторы "var" не просто были неявно напечатаны, но также были локалями init-once. Очевидно, что мы никогда не реализовывали локаторы init-once.