#c_sharp #net #clr
Есть код 1 int i = 123; string s = $"{i}"; И есть код 2 int i = 123; string s = $"{i.ToString()}"; В первом варианте будет происходить боксинг или с интерполяцией не происходит такого и компилятор понимает что надо вызвать ToString?
Ответы
Ответ 1
1) string s = $"{i}"; превращается в string.format, который принимает object'ы, боксинг присутствует 2) string s = $"{i.ToString()}"; передается строка, боксить нечегоОтвет 2
В первом варианте будет происходить боксинг Да. с интерполяцией не происходит такого и компилятор понимает что надо вызвать ToString? Ваше утверждение "надо вызвать ToString" не является корректным, так как "надо" вызвать вовсе не тот ToString, который вызываете Вы. using System; class Test { struct S: IFormattable { public override string ToString() => "Object.ToString"; public string ToString(string format, IFormatProvider formatProvider) => "IFormattable.ToString"; } public static void Main() { S s = new S(); Console.WriteLine($"{s}"); Console.WriteLine($"{s.ToString()}"); } } https://ideone.com/gRz74U Так как поведение String.Format не является частью стандарта языка C#, то компилятор не имеет права выполнять, предложенную Вами, оптимизацию, так как он не может знать какой именно ToString нужно вызвать и с какими параметрами. Более того, если определение типа S находится в другой сборке, то на этапе компиляции компилятор даже не будет иметь достаточного количества информации, чтобы определить, какой метод вызвать.
Комментариев нет:
Отправить комментарий