Я понимаю, что вывод типа не является точной наукой
Я не уверен, что согласен.Спецификация довольно подробная.
Мне было интересно, есть ли здесь какое-то фундаментальное «правило», которого я здесь упускаю
Фундаментальное правило, которое вы упускаете, - это, вероятно,ограничения не являются частью подписи.Вывод типа работает на основе подписи.
На мой взгляд, существуют веские причины для такого решения.Тем не менее, многие люди считают, что я морально неправ, полагая, что есть веские причины для такого дизайнерского решения.Если вам интересно прочесть несколько миллионов слов на тему, прав я или нет, посмотрите мою статью на эту тему и сотни или около того комментариев о том, что я неправ:
http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx
Является ли это недостатком процесса вывода?
Возможно, да.На мой взгляд, это разумный выбор, учитывая конкурирующие требования дизайна.(«Делать то, что имел в виду пользователь» и «выдавать ошибки, когда вещи выглядят неоднозначно».)
- это мое ожидание, что компилятор должен «выяснить это» в этом случае необоснованно?
Нет.Вы кажетесь разумным человеком, и ваши ожидания, кажется, основаны на веских доводах.Однако вполне возможно иметь разумное ожидание, которое, тем не менее, не выполнено.Это может быть одним из таких случаев.
Могу ли я изменить сигнатуру метода таким образом, чтобы сделать его в равной степени функциональным и в то же время «выводимым»?
Это будет сложно, поскольку универсальный тип словаря не является ковариантным или контравариантным в своих преобразованиях.Понятие, которое вы хотите уловить, нелегко выразить в системе типов способом, который позволяет сделать вывод.
Если вы предпочитаете использовать языки с более сложным выводом типов, подумайте об использовании F #.Если вы предпочитаете языки, которые склоняются к «делать то, что имел в виду пользователь», а не «сообщать об ошибках по неоднозначности», рассмотрите возможность использования VB.