2016-02-02 3 views
3

Использование строковой интерполяции делает мой формат строки более понятным, однако мне нужно добавить .ToString() звонки, если мои данные являются типом значений.Избегаемый бокс в интерполяции строк

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

var person = new Person { Name = "Tom", Age = 10 }; 
var displayText = $"Name: {person.Name}, Age: {person.Age.ToString()}"; 

.ToString() делает формат более длинным и уродливым. Я попытался избавиться от него, но string.Format - это встроенный статический метод, и я не могу его вводить. У вас есть идеи об этом? И поскольку интерполяция строк является синтаксическим сахаром string.Format, почему бы им не добавить .ToString() вызовов при генерации кода позади синтаксиса сахара? Я думаю, что это выполнимо.

ответ

3

Я не вижу, как вы можете избежать этого бокса компилятором. Поведение string.Format не является частью спецификации C#. Вы не можете полагаться на то, что он назовет Object.ToString(). Фактически это не так:

using System; 
public static class Test { 
    public struct ValueType : IFormattable { 
     public override string ToString() => "Object.ToString"; 
     public string ToString(string format, IFormatProvider formatProvider) => "IFormattable.ToString"; 
    } 
    public static void Main() { 
     ValueType vt = new ValueType(); 
     Console.WriteLine($"{vt}"); 
     Console.WriteLine($"{vt.ToString()}"); 
    } 
} 
Смежные вопросы