Есть ли философская причина, по которой конструктор не поддерживает вывод типов?
Нет.Если у вас есть
new Foo(bar)
, тогда мы можем идентифицировать все типы, называемые Foo, в области видимости независимо от общей арности, а затем выполнить разрешение перегрузки для каждого, используя модифицированный алгоритм вывода типа метода.Затем мы должны были бы создать алгоритм 'betterness', который определяет, какой из двух применимых конструкторов в двух типах, имеющих одинаковое имя, но различную универсальную арность , является лучшим конструктором.Для обеспечения обратной совместимости всегда должен побеждать ctor для неуниверсального типа.
Есть ли практическая причина, по которой конструктор не может поддерживать вывод типа?
Да.Даже если выгода от этой функции превышает ее стоимость, которая является значительной, этого недостаточно для реализации этой функции.Эта функция должна быть не только чистой выигрышем, но и большим чистым выигрышем по сравнению со всеми возможными функциями, в которые мы могли бы инвестировать. Она также должна быть лучше, чем тратить это время иусилия по исправлению ошибок, производительности работы и других возможных областей, которые мы могли бы приложить эти усилия.И в идеале он должен хорошо вписываться в «тему» релиза.
Кроме того, как вы правильно заметили, вы можете получить преимущества этой функции, фактически не имея самой функции, используяфабричный образец.Наличие простых обходных путей снижает вероятность того, что функция когда-либо будет реализована.
Эта функция уже давно включена в список возможных функций.Его никогда не было достаточно высоко в списке, чтобы его можно было реализовать.
ОБНОВЛЕНИЕ март 2015
Предложенная функция сделала его достаточно близким к вершине списка для указания C # 6 иразработан, но затем был сокращен.