【问题标题】:How can this be a null reference?这怎么可能是空引用?
【发布时间】:2017-09-18 00:22:07
【问题描述】:
Current.Images?.Count > 0 ? $"{Current.Images.Count} Image(s)" : "Enter Image";

Resharper 认为 Current.Images.Count 可能是一个空引用。弄清楚某些东西是否可以为空已经足够好,这让我想知道我是否遗漏了一些东西。

我的逻辑:条件为真的唯一方法是,如果 Images 不为 null 并且实际上至少有一个值。

编辑:问题不是与 Current。此时它不能为空,Resharper 知道这一点。

【问题讨论】:

  • Current 可以为空吗?
  • 我认为 Current 是一个类,而 Images 是一个静态列表属性。基于此, Current 不能为空?!但另一方面,没有其他选择。 ;)
  • @SeanStayn 为什么它应该是静态的?如果不是,那么Current 很可能为空。
  • 简单:将Current设为null,看看会发生什么。您正在检查以确保 Images 不为空,但您并未检查 Current 是否不为空。
  • @Loren Pechtel 你能给我们看一下 Current 的声明吗?

标签: c# visual-studio-2015 resharper


【解决方案1】:

它在 R# 2017.2 中是 a bug,它将在即将到来的 R# 2017.2.1 错误修复更新中得到修复。

【讨论】:

    【解决方案2】:

    如果 current 是一个变量,你应该验证它不为空:

    ((Current ?? throw new NullReferenceException(nameof(Current)).Images?.Count > 0) 
        ? $"{Current.Images.Count} Image(s)" 
        : "Enter Image";
    

    (这个例子的第一行有大括号,主要是为了便于阅读。因为在某些情况下,空合并表达式的计算结果完全为空,并且您的代码读者可以省去弄清楚在这种情况下是否是这种情况的麻烦. 是否支持这种方式取决于团队的代码风格偏好)

    此外,将代码分散到多行有助于找出错误的部分。

    如果 Current 是一个静态类,那么 Resharper 似乎是错误的。您可以指示 resharper 忽略此实例(在您的代码中)或忽略每个实例(在 resharper 设置中)

    【讨论】:

    • 它实际上并没有导致错误,我在问为什么 Resharper 认为它很危险。 Current 不能为空,Resharper 知道这一点。图片可以为空,但在第二个引用中怎么可能为空?
    • 我认为 RS 无法正确评估表达式。另外,为什么图像可以为空? (我总是避免可以为空的集合。通常,不正确地使用空而不是空集合。
    【解决方案3】:

    Resharper 将您的代码标记为可能的空引用异常,因为您没有检查 Current.Images 是否为空,在您的字符串文字中..

    您的代码:

    Current.Images?.Count > 0 ? $"{Current.Images.Count} Image(s)" : "Enter Image";
    

    安全码:

    Current.Images?.Count > 0 ? $"{Current.Images?.Count} Image(s)" : "Enter Image";
                                     missing ____^
    

    【讨论】:

    • 这就是我处理它的方式,但我看不到 Current.Images 在那时为空的任何情况。对于第一个评估非零值的测试,实际上必须有一个包含某些内容的集合。
    猜你喜欢
    • 2020-05-25
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2016-08-19
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多