I was using Reflector to look at the implementation of String.Format and had always been under the impression that the overloads of String.Format that took 1, 2 & 3 argu
You are forgetting about the code in the app required to make the call. Creating the array and filling it takes a lot more IL than just passing 3 args.
One reason, as Hans mentions, is that creating an array is a lot of unnecessary overhead in most common cases of formatting a string. This saves space in the EXE.
Another reason is that not all languages support variadic functions (use of params
in C#). This allows users of those languages to avoid array creation for the most common cases of string formatting. This saves a lot for languages that don't have simple syntax for array creation and initialization.