Это, вероятно, пережиток ранней реализации .NET Framework; если вы посмотрите * на реализации методов Format (строка, объект) , Format (строка, объект, объект) и т. д., вы увидите, что все они вызов Формат (IFormatProvider, строка, объект []) . Таким образом, абсолютно никакого выигрыша в производительности нет (если ваша сборка выполняется в режиме отладки, вызывать перегрузки объектов еще менее эффективно - не то, чтобы вы могли ее измерить).
Единственная техническая причина, которую я могу придумать, заключается в том, что эти перегрузки полезны для языков, которые не поддерживают аргументы params. В этом случае программисты могут по-прежнему вызывать String.Format («Hello {0}», «world»), а не заставлять их создавать временный массив (именно это аргументы params предлагают делать компилятору). Это также объясняет, почему существует только 3 перегрузки объекта: они покрывают 99% всех вызовов String.Format.
*) Использование рефлектора или кодовой базы устаревшего ротора.