C # - Benutzerdefinierte veraltete Warnungen selektiv unterdrücken

212

Ich verwende das ObsoleteAttribut (wie gerade von anderen Programmierern vorgeschlagen), um eine Warnung anzuzeigen, wenn eine bestimmte Methode verwendet wird.

Gibt es eine Möglichkeit, die Warnung ähnlich wie bei CodeAnalysis SuppressMessagean Stellen zu unterdrücken, an denen die Verwendung gerechtfertigt ist?

Danke dir!

BEARBEITEN

Dies ist, [Obsolete("Some message")]da ich einige Details zur Warnung hinzufügen muss. Funktioniert jedoch #pragma warning disable 612nicht mehr, wenn ich die Nachricht zum nackten [Obsolete]Attribut hinzufüge ...

BEARBEITEN 2

Die richtige Warnnummer gefunden - Es ist 618, wenn eine Meldung nach dem veralteten Attribut angezeigt wird.

Also, um zu tun, was ich tun möchte:

#pragma warning disable 618

und dann nach dem Anruf

#pragma warning restore 618

Vielen Dank an Jared Par und Jon Skeet, die mich in die richtige Richtung gelenkt haben!

Alex
quelle

Antworten:

257

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

Stellen Sie die Warnung anschließend wieder her, damit Sie keine "schlechten" Anrufe verpassen.

Jon Skeet
quelle
1
Dies funktioniert nur, wenn ich keine Nachricht mit meinem Attribut "Veraltet" gebe. Ich habe jedoch eine Meldung wie diese: [Veraltet ("Deshalb sollte dies nicht verwendet werden - verwenden Sie stattdessen XYZ.")]. Sobald ich die Nachricht eingegeben habe, funktioniert die Pragma-Warnungssperre 612 nicht mehr und ich erhalte trotzdem Warnungen. Benötige ich stattdessen vielleicht eine andere Fehler-ID?
Alex
2
Gefunden - Die korrekte Warnnummer lautet 618, wenn das Attribut Veraltet eine Meldung enthält. Danke dir!
Alex
2
Goodo - Ich habe mein Beispiel angepasst.
Jon Skeet
6
@ George: Sie können sie hier finden .
Jordão
3
Siehe meine Antwort, wie man die Warn- / Fehlernummer überhaupt erhält.
Aaron Thoma
130

Die Absicht ist es, die Warnung für obsolet deaktivieren Nutzung , unabhängig davon , ob das Konstrukt mit markiert ist [Obsolete]oder [Obsolete("Message")]. Verwenden Sie also sowohl CS0612 als auch CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
quelle
3
Beachten Sie auch, dass die Warnungen nicht auftreten, wenn sich die veraltete Verwendung in einer Klasse befindet, die selbst als veraltet markiert ist.
Redcalx
3
Gibt es eine Möglichkeit, einen Fehler ebenfalls zu deaktivieren, falls er Obsoleteals Fehler markiert wurde?
Shimmy Weitzhandler
2
@Shimmy: Wenn es als Fehler markiert ist, müssen Sie es beheben. Es gibt keine Möglichkeit, Fehler zu unterdrücken. Möglicherweise handelt es sich um ein Syntaxproblem. Stellen Sie es als Frage auf dieser Website, und Sie erhalten mit Sicherheit eine gute Antwort.
Jordão
18

So erhalten Sie zunächst die Warn- / Fehlernummer :

  1. Erstellen Sie Ihr Projekt neu.
  2. Gehen Sie zum Ausgabefenster .
  3. Schlagen Sie die Zeile der Warnung / des Fehlers nach, die Sie unterdrücken möchten.
    Beispielsweise:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Kopieren Sie den Nummernteil nach " CS".
  5. Fahren Sie dann fort, wie Jon Skeet sagt .

(Gehen Sie besser immer so vor , wie Jon Skeet sagt ...)

Aaron Thoma
quelle
9

Sie suchen nach der #pragmaRichtlinie zum Deaktivieren der Warnung

Im Wesentlichen fügen Sie den folgenden Befehl über der Aufrufsite in die CS-Datei ein.

#pragma warning disable 612
SomeMethodCall

612 ist die Fehlermeldung ID zum Aufrufen veralteter Methoden

JaredPar
quelle
Dies funktioniert nur, wenn ich keine Nachricht mit meinem Attribut "Veraltet" gebe. Ich habe jedoch eine Meldung wie diese: [Veraltet ("Deshalb sollte dies nicht verwendet werden - verwenden Sie stattdessen XYZ.")]. Sobald ich die Nachricht eingegeben habe, funktioniert die Pragma-Warnungssperre 612 nicht mehr und ich erhalte trotzdem Warnungen. Benötige ich stattdessen vielleicht eine andere Fehler-ID?
Alex
2
Gefunden - Die korrekte Warnnummer lautet 618, wenn das Attribut Veraltet eine Meldung enthält.
Alex