Используется вывод типа для универсальных методов. Обратите внимание, что это изменилось между C # 2 и 3. Например, это не сработало бы в C # 2:
What("hello", new object());
... тогда как в C # 3 (или 4). В C # 2 вывод типа выполнялся для каждого аргумента, и результаты должны были точно совпадать. В C # 3 каждый аргумент вносит информацию, которая затем складывается, чтобы вывести аргументы типа. C # 3 также поддерживает вывод типа многофазный , где компилятор может обработать один аргумент типа, а затем посмотреть, есть ли у него дополнительная информация об остальном (например, из-за лямбда-выражений с неявными типами параметров). В основном это продолжается до тех пор, пока он не может получить больше информации, или он заканчивает - или видит противоречивую информацию. Вывод типа в C # не такой мощный, как алгоритм Хиндли-Милнера , но он работает лучше в других отношениях (в частности, он всегда продвигается вперед).
См. Раздел 7.4.2 спецификации C # 3 для получения дополнительной информации.