12

次のコードを検討してください。

    public static void Foo()
    {
        Bar(null);
    }

    public static void Bar([NotNull] string s)
    {
        if (s == null)
            throw new ArgumentNullException("s");
    }

この[NotNull]属性は、nullであってはならないBar呼び出し元に通知するために使用されます。sこれは正常に機能し、nullをBar「NotNull」属性でマークされたエンティティへの「null」割り当ての可能性)に渡すと警告が表示されます。

しかし、それは実際に私がnullを渡すことを妨げるわけではないので、Barそれでもnullかどうかをチェックする必要sがあります。では、なぜ私も警告を受け取るのですかif (s == null)式は常にfalseです)

私の知る限り、この属性にはあいまいな意味があります。コンテキストに応じて、2つの異なることを意味する場合があります。

  • 呼び出し元の場合:null引数を渡さないでください
  • 呼び出し先の場合:この引数はnullではありません

この属性を正しく使用していますか、それとも何かが足りませんか?

ところで、私はResharper 7 EAPを使用しているので、バグの可能性があります。ただし、報告する前に、使用法が正しいことを確認したいのですが...


編集:R#5.1を使用して同じことを試しました。呼び出しサイトには警告が表示されますが、メソッドには表示されません。JetbrainのYoutrackで報告します。


EDIT2:ここで報告されたバグ

4

1 に答える 1

3

私が知る限り、あなたはそれを正しく使用しており、ReSharperは比較が常にであるとあなたに言うのは間違っていますfalse。属性はドキュメントにすぎず、[NotNull]コードは入力値を再確認する権利があります。ReSharperが間違った提案や愚かな提案をしたのはこれが初めてではありません。JetBrainsの優れた点は、これを報告して開発者から直接フィードバックを得ることができる公開バグトラッカーを備えていることです。

そうは言っても(そして、あなたがそれを知っているなら私を許してください)、C#4.0のコードコントラクトはこれを簡単で、予測可能で、そして信頼できるものにします:

Contract.RequiresAlways(s != null);
于 2012-05-22T07:34:56.140 に答える