C # - Supprimer sélectivement les avertissements obsolètes personnalisés

212

J'utilise l' Obsoleteattribut (comme vient de le suggérer mes collègues programmeurs) pour afficher un avertissement si une certaine méthode est utilisée.

Existe-t-il un moyen de supprimer l'avertissement similaire à CodeAnalysis ' SuppressMessageaux points où l'utilisation est justifiée?

Cela doit fonctionner pour [Obsolete("Some message")]lequel génère l'avertissement 618 et l' [Obsolete]attribut plain sans message qui génère l'avertissement 612.

Alex
la source

Réponses:

257

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

Rétablissez ensuite l'avertissement afin de ne pas manquer les "mauvais" appels.

Jon Skeet
la source
1
Cela ne fonctionne que si je ne donne pas de message avec mon attribut obsolète. J'ai cependant un message comme celui-ci: [Obsolète ("C'est pourquoi cela ne devrait pas être utilisé - utilisez XYZ à la place.")]. Une fois que j'ai mis le message, l'avertissement pragma désactivé 612 cesse de fonctionner et je reçois des avertissements malgré tout. Ai-je besoin d'un autre ID d'erreur à la place?
Alex
2
Trouvé - Le numéro d'avertissement correct est 618 s'il y a un message dans l'attribut Obsolète. Je vous remercie!
Alex
2
Goodo - J'ai ajusté mon exemple pour correspondre à cela.
Jon Skeet
6
@George: Vous pouvez les trouver ici .
Jordão
3
Voir ma réponse sur la façon d'obtenir le numéro d'avertissement / d'erreur en premier lieu.
Aaron Thoma
131

L' intention est de désactiver l'avertissement pour une utilisation obsolète , que la construction soit marquée avec [Obsolete]ou [Obsolete("Message")]. Utilisez donc à la fois CS0612 et CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
la source
3
Notez également que les avertissements ne se produisent pas si l'utilisation obsolète se trouve dans une classe qui est elle-même marquée comme obsolète.
redcalx
3
Existe-t-il un moyen de désactiver une erreur également, au cas où a Obsoleteété marqué comme une erreur?
Shimmy Weitzhandler
2
@Shimmy: s'il est marqué comme une erreur, vous devez le corriger, il n'y a aucun moyen de supprimer les erreurs. Ce pourrait être un problème de syntaxe, postez-le comme une question sur ce site, et vous obtiendrez certainement une bonne réponse.
Jordão
18

Voici comment obtenir le numéro d'avertissement / d'erreur en premier lieu:

  1. Reconstruisez votre projet.
  2. Accédez à la fenêtre Sortie .
  3. Recherchez la ligne de l'avertissement / erreur que vous souhaitez supprimer.
    Par exemple:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Copiez la partie numérique après " CS".
  5. Ensuite, procédez comme Jon Skeet le dit .

(Mieux vaut toujours procéder comme le dit Jon Skeet …)

Aaron Thoma
la source
9

Vous recherchez la #pragmadirective d'avertissement de désactivation

Vous ajoutez essentiellement la commande suivante au-dessus du site d'appel dans le fichier .cs.

#pragma warning disable 612
SomeMethodCall

612 est l'ID du message d'erreur pour appeler des méthodes obsolètes

JaredPar
la source
Cela ne fonctionne que si je ne donne pas de message avec mon attribut obsolète. J'ai cependant un message comme celui-ci: [Obsolète ("C'est pourquoi cela ne devrait pas être utilisé - utilisez XYZ à la place.")]. Une fois que j'ai mis le message, l'avertissement pragma désactivé 612 cesse de fonctionner et je reçois des avertissements malgré tout. Ai-je besoin d'un autre ID d'erreur à la place?
Alex
2
Trouvé - Le numéro d'avertissement correct est 618 s'il y a un message dans l'attribut Obsolète.
Alex