Целевая типизация — это термин, используемый, когда выражение получает свой тип из контекста, в котором оно используется. В C# 9.0 некоторые выражения, которые ранее не имели целевого типа, теперь могут руководствоваться своим контекстом.[Добро пожаловать в C# 9.0 | Блог .NET (microsoft.com)]

Все мы знаем, что когда мы хотим создать новый объект, нам нужно использовать ключевое слово «новое» плюс указание целевого типа, как показано ниже:

User objUser = new User();

этот синтаксис в порядке, но здесь есть простой вопрос. Я уже объявил, что собираюсь создать объект типа User, сказав: User objUser`, так зачем мне снова использовать new User()`?

В этой ситуации, когда целевой тип известен, мы можем переписать код, как показано ниже:

User objUser = new();

Теперь у нас есть целевое типизированное «новое» выражение! Обратите внимание, что целевой ввод «нового» выражения работает только тогда, когда мы явно указываем тип, очевидно, когда мы используем var` для создания объекта, целевой ввод не имеет значения. Например, следующий код НЕ будет работать:

var objUser = new();//Error: There is no target type for 'new()'

Если мы вернемся к C#, то обнаружим, что подобное поведение уже было в C# для неявно типизированных выражений массива, где мы смогли создать массив, как показано ниже:

var myArray = new []{1, 2, 3};

Хорошо, а теперь давайте посмотрим на эту функцию и с другой точки зрения. Вы помните ключевое слово var` и его использование? Отлично, когда мы можем опустить Тип, есть ли разница, опускать его с левой или с правой стороны выражения? давайте посмотрим на эти два выражения:

User objUser1 = new();
var objUser2 = new User();

На первый взгляд кажется пустой тратой времени думать о выражении new() целевого типа. Но так ли это и все ли это? Наверняка НЕТ. почему? Предположим, вы собираетесь определить поле класса. Можете ли вы использовать var` для определения поля в классе? Нет :-) На самом деле var` полезно, когда мы собираемся определить локальную переменную.

Что компилятор думает о var` и целевом типе new()? Компилятор сгенерирует один и тот же код IL как для выражения var`, так и для нового выражения целевого типа. В нашем примере компилятор сгенерирует следующий IL-код после компиляции:

User objUser1 = new User();
User objUSer2 = new User();

Вы можете прочитать больше об этой теме на:

  1. Новые выражения с целевым типом| Документы Майкрософт
  2. C# 9.0: Новые выражения с целевым типом — Томас Клавдий Хубер