12

考虑以下代码:

    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为 null。那么为什么我也会收到警告if (s == 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 回答