Suprimir seletivamente avisos obsoletos personalizados

212

Estou usando o Obsoleteatributo (como sugerido por outros programadores) para mostrar um aviso se um determinado método for usado.

Existe uma maneira de suprimir o aviso semelhante ao CodeAnalysis ' SuppressMessagenos pontos em que o uso é justificado?

Obrigado!

EDITAR

Isso é [Obsolete("Some message")]porque eu preciso incluir alguns detalhes sobre o aviso. No entanto, #pragma warning disable 612não funciona mais quando adiciono a mensagem a nu[Obsolete] atributo ...

EDIT 2

Encontrado o número de aviso correto - é 618 se você tiver uma mensagem seguindo o atributo obsoleto.

Então, para fazer o que eu quero fazer:

#pragma warning disable 618

e depois da ligação

#pragma warning restore 618

Obrigado a Jared Par e Jon Skeet por me apontarem na direção certa!

Alex
fonte

Respostas:

257

Use #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");
    }
}

Restaure o aviso posteriormente para não perder chamadas "ruins".

Jon Skeet
fonte
1
Isso só funciona se eu não der uma mensagem com o meu atributo Obsoleto. Eu tenho uma mensagem assim: [Obsoleto ("É por isso que isso não deve ser usado - use XYZ.")]. Depois de inserir a mensagem, o aviso de pragma desativar 612 para de funcionar e estou recebendo avisos independentemente. Preciso de outro ID de erro, talvez?
975 Alex
2
Encontrei - o número de aviso correto é 618 se houver uma mensagem no atributo Obsoleto. Obrigado!
975 Alex
2
Goodo - ajustei meu exemplo para combinar com isso.
9139 Jon Skeet
6
@ George: Você pode encontrá-los aqui .
Jordão
3
Veja minha resposta sobre como obter o número de aviso / erro em primeiro lugar.
Aaron Thoma
130

A intenção é desativar o aviso para uso obsoleto , independentemente de a construção estar marcada com [Obsolete]ou [Obsolete("Message")]. Portanto, use o CS0612 e o CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
fonte
3
Observe também que os avisos não ocorrem se o uso obsoleto estiver em uma classe que é marcada como obsoleta.
Redcalx #
3
Existe uma maneira de desativar um erro também, caso tenha Obsoletesido marcado como um erro?
Shimmy Weitzhandler
2
@ Shimmy: se estiver marcado como um erro, você deve corrigi-lo, não há como suprimir erros. Pode ser um problema de sintaxe, poste-o como uma pergunta neste site e você certamente obterá uma boa resposta.
Jordão
18

Veja como obter o número de aviso / erro em primeiro lugar:

  1. Reconstrua seu projeto.
  2. Vá para a janela Saída .
  3. Procure a linha do aviso / erro que você deseja suprimir.
    Por exemplo:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Copie a parte do número após " CS".
  5. Em seguida, prossiga como Jon Skeet diz .

(Melhor sempre proceder como Jon Skeet diz ...)

Aaron Thoma
fonte
9

Você está procurando a #pragmadiretiva de desativação de aviso

Essencialmente, você adiciona o seguinte comando acima do site de chamada no arquivo .cs.

#pragma warning disable 612
SomeMethodCall

612 é o ID da mensagem de erro para chamar métodos obsoletos

JaredPar
fonte
Isso só funciona se eu não der uma mensagem com o meu atributo Obsoleto. Eu tenho uma mensagem assim: [Obsoleto ("É por isso que isso não deve ser usado - use XYZ.")]. Depois de inserir a mensagem, o aviso de pragma desativar 612 para de funcionar e estou recebendo avisos independentemente. Preciso de outro ID de erro, talvez?
975 Alex
2
Encontrei - o número de aviso correto é 618 se houver uma mensagem no atributo Obsoleto.
975 Alex