Почему строка-интерполяция предпочитает перегрузку метода с string
вместо IFormattable
?Перегруженные методы строк со строковой интерполяцией
Представьте себе следующее:
static class Log {
static void Debug(string message);
static void Debug(IFormattable message);
static bool IsDebugEnabled { get; }
}
У меня есть объекты с очень дорогой ToString()
. Ранее я следующее:
if (Log.IsDebugEnabled) Log.Debug(string.Format("Message {0}", expensiveObject));
Теперь я хотел бы иметь IsDebugEnabled логику внутри Debug(IFormattable)
и вызвать ToString() на объектах в сообщении только тогда, когда это необходимо.
Log.Debug($"Message {expensiveObject}");
Это, однако, вызывает перегрузку Debug(string)
.
вставляемых строк разрешения на 'строку ', но имеют неявные преобразования типов в' IFormattable'. Итак, если вы 'IFormattable msg = $" Message {дорогоеобъект} "; Log.Debug (msg); 'вы должны быть в бизнесе. См. Https://msdn.microsoft.com/en-gb/library/dn961160.aspx#Anchor_0 – spender
См. Этот образец на [TryRoslyn] (http://goo.gl/eiRtVr), IFormattable - дым и зеркала, с форматом() внизу :) – PTwr
Здесь вы действительно должны использовать 'ConditionalAttribute'. – leppie