Подтвердить что ты не робот

Можно ли отключить неявный вызов 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" будет интерфейсом, я мог бы сделать это, используя явную реализацию интерфейса в моем классе.

Спасибо.

4b9b3361

Ответ 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, как показано в этом ответе на мой вопрос.

Если вы сочтете это полезным, пожалуйста, сообщите об этом авторам оригинального ответа.