Я отмечаю, что, несмотря на то, что ваш код использует интерполированную строку C#, он не использует класс FormattedString
, поскольку компилятор C# будет использовать только FormattedString
, если интерполированная строка непосредственно присваивается FormattedString
-типированной переменной, полю или параметру (с чем я не согласен, но все равно).
CLR книги через C# пишет, что String.Format вызовет метод ToString внутренне, чтобы получить строковое представление объекта.
Да, но все перегрузки String.Format
используют параметры типа Object
или params Object[]
, что обязательно означает упаковку его аргументов.
почему бокс происходит в примере 1?
Потому что он должен передать int n
в Object arg0
.
Вот генерируемый IL когда я компилирую ваш первый блок кода в LinqPad (C# 8.0, с включенной оптимизацией компилятора):
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldstr "{0}"
IL_0007: ldloc.0
IL_0008: box System.Int32
IL_000D: call System.String.Format
IL_0012: pop
IL_0013: ret
Вы можете увидеть инструкцию box
при смещении инструкции IL_0008
, прямо перед тем, как она пройдет это в String.Format
.