0Pricing
C# Academy · Урок

Вывод типа коллекций по контексту

Позволяйте целевому типу управлять созданием коллекции.

«Вывод типа коллекций по контексту» — бесплатный урок 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,3

var не является целевым типом

Нельзя написать 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 — локальная установка не требуется.

Все уроки этого курса

  1. Синтаксис выражений коллекций
  2. Элемент распространения
  3. Вывод типа коллекций по контексту
  4. Построители коллекций
← Назад к C# Academy