C #: suprime selectivamente las advertencias obsoletas personalizadas

212

Estoy usando el Obsoleteatributo (como lo sugirieron otros programadores) para mostrar una advertencia si se usa un método determinado.

¿Hay alguna manera de suprimir la advertencia similar a CodeAnalysis SuppressMessageen los puntos donde el uso está justificado?

Esto debe funcionar para lo [Obsolete("Some message")]que genera la advertencia 618 y el [Obsolete]atributo simple sin mensaje que genera la advertencia 612.

Alex
fuente

Respuestas:

257

Uso #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 la advertencia luego para que no se pierda las llamadas "malas".

Jon Skeet
fuente
1
Esto solo funciona si no doy un mensaje con mi atributo Obsoleto. Sin embargo, tengo un mensaje como este: [Obsoleto ("Esta es la razón por la cual no debería usarse, use XYZ en su lugar")]. Una vez que puse el mensaje, la advertencia de pragma deshabilitar 612 deja de funcionar y de todos modos recibo advertencias. ¿Necesito otra identificación de error en su lugar, tal vez?
Alex
2
Lo encontré: el número de advertencia correcto es 618 si hay un mensaje en el atributo Obsoleto. ¡Gracias!
Alex
2
Goodo: he ajustado mi ejemplo para que coincida con esto.
Jon Skeet
66
@George: Puedes encontrarlos aquí .
Jordão
3
Vea mi respuesta sobre cómo obtener el número de advertencia / error en primer lugar.
Aaron Thoma
131

La intención es deshabilitar la advertencia de uso obsoleto , independientemente de si la construcción está marcada con [Obsolete]o [Obsolete("Message")]. Entonces use CS0612 y CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
fuente
3
También tenga en cuenta que las advertencias no se producen si el uso obsoleto está en una clase que está marcada como obsoleta.
redcalx
3
¿Hay alguna manera de deshabilitar un error también, en caso de que haya Obsoletesido marcado como un error?
Shimmy Weitzhandler
2
@Shimmy: si está marcado como un error, entonces debe solucionarlo, no hay forma de suprimir los errores. Puede ser un problema de sintaxis, publíquelo como una pregunta en este sitio y seguramente obtendrá una buena respuesta.
Jordão
18

Aquí se explica cómo obtener el número de advertencia / error en primer lugar:

  1. Reconstruye tu proyecto.
  2. Vaya a la ventana de salida .
  3. Busque la línea de la advertencia / error que desea suprimir.
    Por ejemplo:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Copie la parte del número después de " CS".
  5. Luego proceda como dice Jon Skeet .

(Mejor siempre proceda como dice Jon Skeet ...)

Aaron Thoma
fuente
9

Estás buscando la #pragmadirectiva de advertencia de desactivación

Básicamente, agrega el siguiente comando sobre el sitio de la llamada en el archivo .cs.

#pragma warning disable 612
SomeMethodCall

612 es el ID del mensaje de error para llamar a métodos obsoletos

JaredPar
fuente
Esto solo funciona si no doy un mensaje con mi atributo Obsoleto. Sin embargo, tengo un mensaje como este: [Obsoleto ("Esta es la razón por la cual no debería usarse, use XYZ en su lugar")]. Una vez que puse el mensaje, la advertencia de pragma deshabilitar 612 deja de funcionar y de todos modos recibo advertencias. ¿Necesito otra identificación de error en su lugar, tal vez?
Alex
2
Lo encontré: el número de advertencia correcto es 618 si hay un mensaje en el atributo Obsoleto.
Alex