Start Debugging
2023-08-30 Обновлено 2023-11-05 csharp Edit on GitHub

C# 12 collection expressions

C# 12 вводит новый упрощённый синтаксис создания массивов. Выглядит он так: Важно: тип массива должен быть указан явно, поэтому использовать var для объявления переменной нельзя. Аналогично, чтобы создать Span<int>, можно сделать так: Многомерные массивы Преимущества этого лаконичного синтаксиса...

C# 12 вводит новый упрощённый синтаксис создания массивов. Выглядит он так:

int[] foo = [1, 2, 3];

Важно: тип массива должен быть указан явно, поэтому использовать var для объявления переменной нельзя.

Аналогично, чтобы создать Span<int>, можно сделать так:

Span<int> bar = [1, 2, 3];

Многомерные массивы

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

int[][] _2d = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 }, new int[] { 7, 8, 9 } };

А с новым синтаксисом:

int[][] _2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

Гораздо проще и интуитивнее, не так ли?

Объединение массивов через оператор spread

Вместе с новым синтаксисом появляется и новый оператор spread — .., который заменяет аргумент, к которому применяется, его элементами, фактически позволяя объединять коллекции. Рассмотрим пару примеров.

Начнём с простого — объединения нескольких массивов в один:

int[] a1 = [1, 2, 3];
int[] a2 = [4, 5, 6];
int[] a3 = [7, 8, 9];

int[] merged = [..a1, ..a2, ..a3];

Оператор spread можно применять к любому IEnumerable и использовать для объединения различных IEnumerable в одну коллекцию.

int[] a1 = [1, 2, 3];
List<int> a2 = [4, 5, 6];
Span<int> a3 = [7, 8, 9];

Collection<int> merged = [..a1, ..a2, ..a3];

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

int[] merged = [1, 2, 3, ..a2, 10, 11, 12];

Error CS9176

Error CS9176 There is no target type for the collection expression.

В случае collection expressions нельзя использовать var — тип переменной нужно указывать явно. Пример:

// Wrong - triggers CS9176
var foo = [1, 2, 3];

// Correct
int[] foo = [1, 2, 3];

Error CS0029

Error CS0029 Cannot implicitly convert type ‘int[]’ to ‘System.Index’

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

// Wrong - triggers CS0029
var a = new List<int> { 1, 2, 3, ..a1, 4, 5 };

// Correct
List<int> a = [1, 2, 3, .. a1, 4, 5];

Error CS8652

Error CS8652 The feature ‘collection expressions’ is currently in Preview and unsupported. To use Preview features, use the ‘preview’ language version.

Error CS8652 The feature ‘collection literals’ is currently in Preview and unsupported. To use Preview features, use the ‘preview’ language version.

Эти ошибки означают, что ваш проект ещё не использует C# 12, поэтому новые возможности языка недоступны. Если хотите перейти на C# 12 и не знаете как, загляните в наше руководство по переходу проекта на C# 12.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад