C # - выборочно подавить пользовательские устаревшие предупреждения

212

Я использую Obsoleteатрибут (как это было предложено другими программистами), чтобы показать предупреждение, если используется определенный метод.

Есть ли способ подавить предупреждение, подобное CodeAnalysis, SuppressMessageв тех случаях, когда использование оправдано?

Это должно работать, для [Obsolete("Some message")]которого генерируется предупреждение 618 и простой [Obsolete]атрибут без сообщения, который генерирует предупреждение 612.

Alex
источник

Ответы:

257

Используйте #pragma warning disable:

using System;

class Test
{
    [Obsolete("Message")]
    static void Foo(string x)
    {
    }

    static void Main(string[] args)
    {
#pragma warning disable 0618
        // This one is okay
        Foo("Good");
#pragma warning restore 0618

        // This call is bad
        Foo("Bad");
    }
}

Затем восстановите предупреждение, чтобы не пропустить «плохие» звонки.

Джон Скит
источник
1
Это работает, только если я не выдаю сообщение с моим устаревшим атрибутом. У меня есть сообщение, которое выглядит следующим образом: [устарело («Вот почему это не следует использовать - используйте вместо него XYZ.»)]. Как только я вставляю сообщение, отключение прагматического предупреждения 612 перестает работать, и я получаю предупреждения независимо. Может быть, мне нужен другой идентификатор ошибки?
Алекс
2
Найдено - правильный номер предупреждения - 618, если в атрибуте устарело сообщение. Спасибо!
Алекс
2
Goodo - я настроил свой пример, чтобы соответствовать этому.
Джон Скит
6
@ Джордж: Вы можете найти их здесь .
Джордао
3
Смотрите мой ответ о том, как получить номер предупреждения / ошибки в первую очередь.
Аарон Тома
131

Намерение , чтобы отключить предупреждение для устаревшего использования , независимо от того, является ли конструкция , отмеченные [Obsolete]или [Obsolete("Message")]. Так что используйте как CS0612, так и CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
источник
3
Также обратите внимание, что предупреждения не появляются, если устаревшее использование находится в классе, который сам помечен как устаревший.
Redcalx
3
Есть ли способ отключить ошибку, если она Obsoleteбыла помечена как ошибка?
Shimmy Weitzhandler
2
@Shimmy: если он помечен как ошибка, то вы должны это исправить, нет способа подавить ошибки. Это может быть проблема с синтаксисом, опубликуйте это как вопрос на этом сайте, и вы наверняка получите хороший ответ.
Джордао
18

Вот как получить номер предупреждения / ошибки в первую очередь:

  1. Перестрой свой проект.
  2. Перейти к окну вывода .
  3. Посмотрите на строку предупреждения / ошибки, которую вы хотите подавить.
    Например:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Скопируйте номер части после " CS".
  5. Тогда продолжай, как говорит Джон Скит .

(Лучше всегда действовать, как говорит Джон Скит ...)

Аарон Тома
источник
9

Вы ищете #pragmaдирективу отключения предупреждения

По сути, вы добавляете следующую команду над сайтом вызовов в файле .cs.

#pragma warning disable 612
SomeMethodCall

612 - идентификатор сообщения об ошибке для вызова устаревших методов

JaredPar
источник
Это работает, только если я не выдаю сообщение с моим устаревшим атрибутом. У меня есть сообщение, которое выглядит следующим образом: [устарело («Вот почему это не следует использовать - используйте вместо него XYZ.»)]. Как только я вставляю сообщение, отключение прагматического предупреждения 612 перестает работать, и я получаю предупреждения независимо. Может быть, мне нужен другой идентификатор ошибки?
Алекс
2
Найдено - правильный номер предупреждения - 618, если в атрибуте устарело сообщение.
Алекс