Можно ли отключить неявный вызов ToString()?
Мне интересно, есть ли способ получить ошибку компиляции для этого кода:
var customer = new SomeCustomerClass();
Console.WriteLine("Customer address:" + customer);
поэтому я буду вынужден написать что-то вроде этого:
var customer = new SomeCustomerClass();
Console.WriteLine("Customer address:" + customer.FormatAddress());
Console.WriteLine("Customer accounts:" + customer.FormatAccounts());
Если "ToString" будет интерфейсом, я мог бы сделать это, используя явную реализацию интерфейса в моем классе.
Спасибо.
Ответы
Ответ 1
Невозможно предотвратить этот код во время компиляции. Object.ToString
является частью публичного контракта каждого объекта, и нет способа предотвратить его выключение во время компиляции. В этом конкретном случае компилятор разрешит +
до String.Concat(object, object)
, и реализация завершает вызов Object.ToString
. Невозможно изменить это. Я думаю, что ваш самый плавный путь вперед - переопределить ToString
и вызвать его в FormatAddress
Пожалуйста, не изменяйте ToString
, чтобы выбросить исключение, как предлагают некоторые другие. Большинство .Net ожидает, что ToString
существует и не метает. Изменение, которое будет иметь много неожиданных негативных побочных эффектов для вашей программы (включая уничтожение опыта отладки для этих объектов)
Ответ 2
Вы можете переопределить ToString в своем классе клиента, и там вы можете вызвать метод FormatAddress, если это необходимо.
public override string ToString()
{
return FormatAddress();
}
Ответ 3
В основном.
Используя этот анализатор Roslyn, как показано в этом ответе на мой вопрос.
Если вы сочтете это полезным, пожалуйста, сообщите об этом авторам оригинального ответа.