Ответ 1
Вывод типа метода игнорирует общие ограничения на параметры типа метода (*). Признаки вывода типа метода относятся только к выводам, которые могут быть сделаны путем сравнения аргументов с формальными типами параметров. Поскольку единственным типичным параметром типа, который появляется в ваших формальных типах параметров, является TFoo, невозможно выводить TBar.
Многие считают, что это дизайнерское решение ошибочно, неправильно, неправильно. Хотя я считаю, что это решение действительно приводит к тому, что, на мой взгляд, имеет хорошие свойства. Для расширенной дискуссии по этому вопросу см. Комментарии или комментарии в этой статье в блоге, в которых говорится, что я ошибаюсь, неправильно, неправильно:
(*) Заметим, что я сказал, что ограничения на параметры типа метода игнорируются, а не ограничения вообще. Если выведенные формальные типы параметров создаются такими типовыми типами, что конструкция нарушает их ограничения на параметры типа, то этот факт приводит к ошибке вывода типа, и этот метод не является кандидатом на разрешение перегрузки. Но ни при каких обстоятельствах мы не делаем вывод из ограничения, отличного от "Хм, ясно, что это не сработает".