Вывод типа коллекций по контексту
Позволяйте целевому типу управлять созданием коллекции.
«Вывод типа коллекций по контексту» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Что такое типизация по целевому типу
Типизация по целевому типу означает, что компилятор определяет, что должно создать выражение коллекции, из контекста его использования, а не из явно указанного типа в правой части.
using System;
int[] numbers = [1, 2, 3]; // target type is int[]
Console.WriteLine(numbers.GetType().Name); // Int32[]Целевой тип определяет тип
Одна и та же запись становится конкретным типом, зависящим от типа переменной, параметра или возвращаемого значения, в которое она передаётся.
using System;
using System.Collections.Generic;
int[] asArray = [1, 2, 3];
List<int> asList = [1, 2, 3];
Console.WriteLine(asArray is int[]); // True
Console.WriteLine(asList is List<int>); // TrueТипизация по целевому типу при вызове методов
Если параметр метода имеет тип коллекции, литерал аргумента получает целевой тип этого параметра.
using System;
using System.Collections.Generic;
static void Show(List<int> items) =>
Console.WriteLine(string.Join(",", items));
Show([10, 20, 30]); // target-typed to List<int>Типизация по целевому типу при возврате
Тело метода может возвращать выражение коллекции без указания типа: целевой тип задаётся объявленным типом возвращаемого значения.
using System;
using System.Collections.Generic;
static List<string> Tags() => ["csharp", "dotnet", "ranges"];
Console.WriteLine(Tags().Count); // 3Вывод типа элементов
Тип элементов определяется целевым типом. Если целевой тип — double[], целочисленные литералы автоматически преобразуются к double.
using System;
double[] values = [1, 2, 3]; // ints widen to double
Console.WriteLine(values[0] + 0.5); // 1.5Интерфейсы в качестве целевых типов
Целевыми типами выражений коллекций могут быть интерфейсы, такие как IEnumerable<T>, IReadOnlyList<T> или ICollection<T>; компилятор выбирает подходящий конкретный тип.
using System;
using System.Collections.Generic;
IReadOnlyList<int> ro = [1, 2, 3];
Console.WriteLine(ro.Count); // 3Тернарный оператор и типизация по целевому типу
Обе ветви условного выражения могут быть выражениями коллекций, тип которых определяется общим типом результата.
using System;
bool useDefaults = false;
int[] config = useDefaults ? [0, 0, 0] : [1, 2, 3];
Console.WriteLine(string.Join(",", config)); // 1,2,3var не является целевым типом
Нельзя написать var x = [1, 2, 3];, поскольку var не задаёт целевой тип. Укажите явный тип или используйте выражение там, где ожидается определённый тип.
using System;
// var x = [1, 2, 3]; // compile error: no target type
int[] x = [1, 2, 3]; // ok
Console.WriteLine(x.Length); // 3Типизация по целевому типу и элементы распространения
Типизация по целевому типу и элементы распространения работают вместе: целевой тип определяет итоговый тип коллекции, а элементы распространения предоставляют её содержимое.
using System;
using System.Collections.Generic;
int[] src = [1, 2, 3];
List<int> copy = [..src]; // copies into a List<int>
Console.WriteLine(copy is List<int>); // TrueУменьшение избыточности
Типизация по целевому типу устраняет повторяющиеся имена типов. Сравните избыточную старую форму с лаконичной новой.
using System;
// old: type repeated
int[] oldWay = new int[] { 1, 2, 3 };
// new: type only on the left
int[] newWay = [1, 2, 3];
Console.WriteLine(oldWay.Length == newWay.Length); // TrueОбъединение всех возможностей
Здесь один вспомогательный метод принимает любую коллекцию только для чтения, а вызывающий код свободно передаёт литералы с типом, определённым из контекста.
using System;
using System.Collections.Generic;
static int Count(IReadOnlyCollection<int> c) => c.Count;
Console.WriteLine(Count([1, 2, 3, 4])); // 4Быстрая проверка
Проверьте, насколько хорошо Вы поняли типизацию по целевому типу.
Итоги
Вы узнали, как для выражений коллекций определяется целевой тип.
- Тип назначения — переменной, параметра или возвращаемого значения — определяет способ создания.
- Типы элементов могут расширяться в соответствии с целевым типом.
- Интерфейсы, такие как
IReadOnlyList<T>, могут быть целевыми типами. varне может быть целевым типом.
Часто задаваемые вопросы
Урок «Вывод типа коллекций по контексту» бесплатный?
Да — полный текст урока «Вывод типа коллекций по контексту» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Вывод типа коллекций по контексту»?
Позволяйте целевому типу управлять созданием коллекции. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Вывод типа коллекций по контексту»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Синтаксис выражений коллекций
- Элемент распространения
- Вывод типа коллекций по контексту
- Построители коллекций