考虑以下代码:

    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 时收到警告(可能对标有“NotNull”属性的实体进行“null”赋值)。

但它实际上并没有阻止我传递空值,所以 Bar 仍然必须检查 s 是否为空。 那么为什么我在 if (s == null) (Expression is always false) 上也收到警告?

据我所知,这个属性的含义不明确;根据上下文,它可能意味着两个不同的东西:

调用者的
  • :不要传递空参数
  • 对于被调用者:此参数不为空

  • 我是否正确使用了这个属性,还是我遗漏了什么?

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

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

    EDIT2:错误报告 here

    最佳答案

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

    也就是说,(如果您知道,请原谅我),C# 4.0's Code Contracts 使这变得简单、可预测且可靠:

    Contract.RequiresAlways(s != null);
    

    关于annotations - 需要澄清 Resharper NotNullAttribute 的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10694228/

    10-13 05:57