пятница, 25 марта 2011 г.

C# и вывод generic-типов при создании объекта

C# умеет выводить типы при вызове generic-методов (например, Tuple.Create(5, 5)), однако при вызове конструктора типы нужно задавать явно (например, new Tuple<int, int>(5, 5))

Очевидный workaround, продемонстрированный выше, - использовать фабрику. Но это вынуждает захламлять API для обхода, по сути, недоработки компилятора.

Сегодня я решил разобраться, почему дела обстоят именно так: может быть, я зря негодую, и на текущую реализацию есть объективные причины. Оказалось, Eric Lippert (один из самых известных разработчиков C#; после Хейлсберга, конечно) уже отвечал на этот вопрос на stackoverflow. Вкратце, Эрик говорит, что нет никаких преград перед реализацией вывода типов для конструктора, более того, эта фича уже давно в ToDo-списке, но с очень низким приоритетом. Кроме того, он соглашается, что отсутствие вывода для конструкторов на фоне его наличия для методов порождает inconsistency, но при этом говорит, что цена порой оказывается важнее фичи.

Готов поспорить, что у команды C# самый высокий бюджет среди всех команд-разработчиков компиляторов. На фоне этого говорить о цене этой маленькой фичи как-то странно. Хотя тут вспоминается старый пост Эрика на тему того, что значит "реализовать фичу" согласно стандартам Microsoft. И все равно я разочарован.

Комментариев нет: