CS0672: элемент `Foo.OnSelected()'переопределяет устаревший элемент`Baz.OnSelected()'

В моей DLL я пометил виртуальный метод как устаревший, используя System.ObsoleteAttribute но это не производит предупреждение, которое я ожидал.

Источник DLL (Баз):

[Obsolete("This method has become obsolete, please override `OnEnable` instead.")]
public virtual void OnSelected() {
}

public virtual void OnEnable() {
}

Пользовательский источник (Foo):

// CS0672 - Doesn't show useful message...
public override void OnSelected() {
}

При создании проекта регистрируется следующее предупреждение:

CS0672: участник Foo.OnSelected() переопределяет устаревшего члена Baz.OnSelected(),
Добавьте устаревший атрибут в `Foo.OnSelected()'

Но я бы хотел, чтобы мое пользовательское устаревшее сообщение было доминирующим в этом предупреждении, чтобы мои клиенты могли следовать предоставленным инструкциям. Есть ли способ добиться этого?

1 ответ

Решение

Вы можете добавить второй параметр в свой конструктор атрибута, чтобы сказать компилятору выдать ошибку компиляции (вместо обычного предупреждения "метод устарел"), и ошибка будет использовать сообщение вашего атрибута. Ошибка произойдет, только если метод вызывается.

[Obsolete("This method has become obsolete, please override `OnEnable` instead.", true)]
public virtual void OnSelected() {
}

Обратите внимание, что это не удалит предупреждение CS0672.

Другие вопросы по тегам