Глупый вопрос, но зачем компилируется следующая строка?
int[] i = new int[] {1,};
Как вы можете видеть, я не вошел во второй элемент и оставил там запятую. Все еще компилируется, хотя вы ожидаете, что это не так.
Глупый вопрос, но зачем компилируется следующая строка?
int[] i = new int[] {1,};
Как вы можете видеть, я не вошел во второй элемент и оставил там запятую. Все еще компилируется, хотя вы ожидаете, что это не так.
Я полагаю, что стандарт ECMA 334 говорит:
array-initializer:
{ variable-initializer-list(opt) }
{ variable-initializer-list , }
variable-initializer-list:
variable-initializer
variable-initializer-list , variable-initializer
variable-initializer:
expression
array-initializer
Как вы можете видеть, конечная запятая разрешена:
{ variable-initializer-list , }
↑
P.S. за хороший ответ (даже если этот факт уже был отмечен многими пользователями).:)
Трейлинг-запятая может использоваться для облегчения реализации автоматических генераторов кода (генераторы могут избежать проверки последнего элемента в инициализаторе, поскольку он должен быть записан без конечной запятой) и инициализации условного массива с помощью директив препроцессора.
Это синтаксический сахар. В частности, такая запись может быть полезна при генерации кода.
int[] i = new int[] {
1,
2,
3,
};
Кроме того, когда вы так пишете, чтобы добавить новую строку, вам нужно добавить текст только в одну строку.
Он должен компилироваться по определению.
Нет второго элемента. Конечная запятая является допустимым синтаксисом при определении коллекции элементов.
i
- это массив из int
, содержащий один элемент, i[0]
, содержащий значение 1
.
Еще одно преимущество использования конечной запятой в сочетании с директивами препроцессора:
int[] i = new[] {
#if INCLUDE1
1,
#endif
#if INCLUDE2
2,
#endif
#if INCLUDE3
3,
#endif
};
Без разрешения конечной запятой это было бы намного сложнее написать.
чтобы вы могли сделать это и скопировать/вставить строки, не беспокоясь об удалении/добавлении запятых в правильные места.
int[] i = new[] {
someValue(),
someOtherValue(),
someOtherOtherValue(),
// copy-pasted zomg! the commas don't hurt!
someValue(),
someOtherValue(),
someOtherOtherValue(),
};
То же самое относится к перечислениям:
enum Foo
{
Bar,
Baz,
};