[C#]コンパイル時の警告を抑制する

たまにコンパイラの警告レベルを落とさず、特定のコードでのみ警告を表示させないようにしたい時がある。

たとえば、以下のようなコードを示す。

public class NetworkOrganizer : IOrganizer
{
    public event Action<int> GeometryChanged;
    public void Organize()
    {
        // 省略
    }
}

GeometryChangedイベントはIOrganizerに定義されていて、実装する必要がある。が、たまたまこのクラスでは不要だったとしよう。こういうことは往々にしてあると思う。

「いやいや、このイベントが必要なクラスと不要なクラスがあるという事自体が、まずい設計だということだ。インタフェースとしてうまく抽出できてないということだよ」という人も居るかもしれないが、そんなにちゃんとした設計ができてるような環境でぜひとも仕事してみたいもんだ。

で、まあ、こういう時は以下の様なエラーが出る。

警告 CS0067: イベント 'Project.NetworkOrganizer.GeometryChanged' は使用されませんでした。

こういう時は、「このクラスでは不要なのでこのイベントを使いません。よって警告を抑制します」という旨のコメントを書いて警告を抑制したい。結論から言うと、以下のようにすれば警告を抑制できる。

public class NetworkOrganizer : IOrganizer
{
    #pragma warning disable 0067
    // 本クラスでは使用しない
    public event Action<int> GeometryChanged;
    #pragma warning restore 0067

    public void Organize()
    {
        // 省略
    }
}

(追記:上記コードは初出時「#pragma restore 0067」と書いていましたが、誤りだそうです。ご指摘ありがとうございました。修正しました)

ここで、「0067」は警告に固有の番号であり、VSからだと「出力」ウィンドウに出てくる上記警告メッセージを参照すると分かる。上記では「CS0067」となっているが、「CS」は不要なようだ。

で、このコード、なんかすげー汚い。私は元来、こういう#pragmaとか、コンパイラに直接何かを命令して助けてもらうタイプの処理が、小手先のテクニックであるような気がしてすごく嫌いだ。なるべくなら使いたくないと思っている。加えて、この場合は2行も書かなくてはならず、更に汚く醜い。こういうコードは書きたくないが、こうする以外にやり方が分からなかった。

はじめは、SuppressMessage属性が使用できると思っていたのだけど、どうもこれはコード分析ツールや、FxCop、StyleCopツールから出力される警告は抑制できるようだが、コンパイラの警告は抑制してくれないようだ。

もっと簡潔な書き方は無いのだろうか。

2件のコメント

  1. まきなす より:

    こんにちは
    確かeventを使用しないときのワーニング抑制あったよなと思って検索をかけたらヒットしてここに来ました。
    ありがとうございました。

    抑制したものを解除するのは
    #pragma restore 67
    ではなく
    #pragma warning restore 67
    のようです。

    1. withpop より:

      こんにちは。ご指摘ありがとうございました。記事中に反映しました。

ただいまコメントは受け付けていません。