C # - selektywnie pomija niestandardowe przestarzałe ostrzeżenia

212

Używam tego Obsoleteatrybutu (jak właśnie zasugerowali inni programiści), aby pokazać ostrzeżenie, jeśli używana jest pewna metoda.

Czy istnieje sposób na wyłączenie ostrzeżenia podobnego do CodeAnalysis „ SuppressMessagew miejscach, w których użycie jest uzasadnione?

To musi działać, dla [Obsolete("Some message")]którego generuje ostrzeżenie 618 i zwykły [Obsolete]atrybut bez komunikatu, który generuje ostrzeżenie 612.

Alex
źródło

Odpowiedzi:

257

Użyj #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");
    }
}

Następnie przywróć ostrzeżenie, aby nie przegapić „złych” połączeń.

Jon Skeet
źródło
1
Działa to tylko wtedy, gdy nie podam wiadomości z moim atrybutem Przestarzałe. Mam jednak taki komunikat: [Przestarzały („Dlatego nie należy tego używać - zamiast tego należy użyć XYZ.”)]. Po włożeniu wiadomości ostrzeżenie pragma wyłączone 612 przestaje działać i otrzymuję ostrzeżenia niezależnie od tego. Czy zamiast tego potrzebuję innego identyfikatora błędu?
Alex
2
Znaleziono - prawidłowy numer ostrzegawczy to 618, jeśli w atrybucie Przestarzałe jest komunikat. Dziękuję Ci!
Alex
2
Goodo - dostosowałem mój przykład, aby do tego pasował.
Jon Skeet
6
@George: Znajdziesz je tutaj .
Jordão,
3
Zobacz moją odpowiedź, w jaki sposób uzyskać numer ostrzeżenia / błędu.
Aaron Thoma,
131

Intencją jest, aby wyłączyć ostrzeżenie dla przestarzałego użytkowania , niezależnie od tego, czy konstrukcja jest oznaczony [Obsolete]albo [Obsolete("Message")]. Więc użyj zarówno CS0612, jak i CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
źródło
3
Zauważ również, że ostrzeżenia nie pojawiają się, jeśli przestarzałe użycie jest w klasie, która sama jest oznaczona jako przestarzała.
redcalx,
3
Czy istnieje również sposób na wyłączenie błędu, jeśli Obsoletezostał on oznaczony jako błąd?
Shimmy Weitzhandler,
2
@Shimmy: jeśli jest oznaczony jako błąd, musisz go naprawić, nie ma sposobu, aby ukryć błędy. Może to być problem ze składnią, opublikuj go jako pytanie na tej stronie, a na pewno otrzymasz dobrą odpowiedź.
Jordão,
18

Oto jak uzyskać numer ostrzeżenia / błędu :

  1. Odbuduj swój projekt.
  2. Przejdź do okna Output .
  3. Odszukaj wiersz ostrzeżenia / błędu, który chcesz ukryć.
    Na przykład:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Skopiuj część liczbową poCS”.
  5. Następnie kontynuuj, jak mówi Jon Skeet .

(Lepiej zawsze postępuj, jak mówi Jon Skeet …)

Aaron Thoma
źródło
9

Szukasz #pragmadyrektywy dotyczącej wyłączania ostrzeżeń

Zasadniczo dodajesz następujące polecenie nad witryną wywoływania w pliku .cs.

#pragma warning disable 612
SomeMethodCall

612 to identyfikator komunikatu o błędzie służący do wywoływania przestarzałych metod

JaredPar
źródło
Działa to tylko wtedy, gdy nie podam wiadomości z moim atrybutem Przestarzałe. Mam jednak taki komunikat: [Przestarzały („Dlatego nie należy tego używać - zamiast tego należy użyć XYZ.”)]. Po włożeniu wiadomości ostrzeżenie pragma wyłączone 612 przestaje działać i otrzymuję ostrzeżenia niezależnie od tego. Czy zamiast tego potrzebuję innego identyfikatora błędu?
Alex
2
Znaleziono - prawidłowy numer ostrzegawczy to 618, jeśli w atrybucie Przestarzałe jest komunikat.
Alex