Благодаря комментарию canton7 у нас есть ответ. Эта функция (пока) не поддерживается C#, но в конвейерах обсуждается это. Есть два возможных направления, в которых это может быть принято:
Оператор Diamond <>
Предлагается использовать оператор Diamond, в точности как указано в вопросе:
https://github.com/dotnet/csharplang/issues/2935
Это позволит использовать синтаксис, подобный Java, как указано выше, где ссылочный тип - это интерфейс, а тип объекта - некоторая реализация этого интерфейса.
Новое ключевое слово
Есть предложение использовать ключевое слово new
:
https://github.com/dotnet/csharplang/issues/100
Это предложение для Например, можно было бы просто заменить следующее:
Point p = new Point(1, 2);
на:
Point p = new (1, 2);
Действительно, для общих типов c как тип, так и любые универсальные шаблоны, поставляемые с это, можно было бы сделать вывод. Так что мы могли бы сделать, например:
Hashset<string> set = new();
Сначала это кажется более действенным, чем предложение оператора ромба. Однако, возвращаясь к исходному примеру из вопроса, эта функция, если она будет разработана, не будет работать в случае, когда ссылочным типом является интерфейс. В этом случае будет непонятно, какой объект создать из new
. Например, если бы мы сделали:
ISet<string> set = new ();
Тогда как компилятор узнает, какую реализацию интерфейса ISet
использовать для создания экземпляра объекта этого типа? Таким образом, даже если бы эта функция была реализована, она не решила бы вариант использования, в котором ссылочным типом является интерфейс.