annotations - 需要澄清 Resharper NotNullAttribute 的含义

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

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

据我所知,这个属性的含义不明确;根据上下文,它可能意味着两个不同的东西:
  • 对于调用者:不要传递空参数
  • 对于被调用者:此参数不为空

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

    顺便说一句,我使用的是 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/

    相关文章:

    visual-studio - ReSharper 可以自动运行单元测试吗

    c# - 我如何强制 Resharper 将 CLR 类型名称用于自动生成的代码?

    mysql - 仅当新值不为空时才在 DUPLICATE KEY UPDATE 上合并两个表

    Mysql NOT IS NULL 行为

    Mysql在非空字段上插入或更新为空值时不会出错

    java - 访问接口(interface)中定义的注释,在实现它的类中?

    java - 在界面上查找注释

    c# - 代码是启发式无法访问的

    annotations - MKAnnotationView 未在 iOS 11 中显示

    javascript - 根据当前填充颜色更改注释填充