需要澄清Resharper NotNullAttribute的含义

时间:2012-05-22 00:12:10

标签: annotations resharper notnull

请考虑以下代码:

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

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

[NotNull]上使用Bar属性告诉来电者s不应该为空。这很好用,当我将null传递给Bar可能'null'赋值给标记为'NotNull'属性的实体)时,我收到警告。

但它实际上并没有阻止我传递null,因此Bar仍然必须检查s是否为空。 那么为什么我也会在if (s == null)表达始终为假上收到警告?

据我所知,这个属性含义模糊;根据具体情况,它可能意味着两件事:

  • 表示调用者:不传递空参数
  • 表示被叫方:此参数不为空

我是否正确使用此属性,或者我遗失了什么?

顺便说一句,我正在使用Resharper 7 EAP,所以它可能是一个bug;但是我想在报告之前确保我的用法是正确的......


编辑:在R#5.1工作时尝试了同样的事情;它在呼叫站点上显示警告,但不在方法中显示。我将在Jetbrain的Youtrack上报告。


EDIT2:错误报告here

1 个答案:

答案 0 :(得分:3)

据我所知,你正确使用它并且ReSharper告诉你比较总是false是错误的。 [NotNull]属性只不过是文档,您的代码是正确的,可以仔细检查输入值。这不是ReSharper第一次提出错误或愚蠢的建议。关于JetBrains的一个很酷的事情就是他们有a public bug tracker你可以报告这个并直接从开发者那里获得反馈。

那就是说,(并且如果你意识到的话,请原谅我),C# 4.0's Code Contracts使这变得容易,可预测和可靠:

Contract.RequiresAlways(s != null);