需要澄清Resharper NotNullAttribute的含义

Tho*_*que 12 resharper annotations notnull

请考虑以下代码:

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

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

[NotNull]属性用于Bar告诉s不应为null的调用者.这工作正常,当我将null传递给Bar(可能'null'赋值给标记为'NotNull'属性的实体时),我收到警告.

但它实际上并没有阻止我传递null,所以Bar仍然必须检查是否s为null.那么为什么我也会收到警告if (s == null)(表达总是假的)

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

  • 对于调用者:不传递null参数
  • 对于被调用者:此参数不为null

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

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


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


EDIT2:这里报告错误

Mah*_*dsi 3

据我所知,您使用它是正确的,而 ReSharper 告诉您比较始终是错误的false。该[NotNull]属性只不过是文档,您的代码可以正确地仔细检查输入值。这并不是 ReSharper 第一次提出错误或愚蠢的建议。JetBrains 的一个很酷的事情是他们有一个公共错误跟踪器,您可以在其中报告此问题并直接从开发人员那里获得反馈。

也就是说(如果您意识到这一点,请原谅我),C# 4.0 的代码契约使这一切变得简单、可预测且可靠:

Contract.RequiresAlways(s != null);
Run Code Online (Sandbox Code Playgroud)

  • 显然它已在 R# 7 最终版本中修复 (2认同)