【问题标题】:ReSharper shows possible null assignment on Value for generic CollectionReSharper 显示对通用集合的值可能的空分配
【发布时间】:2012-04-13 14:50:54
【问题描述】:

我正在使用Dictionary<string, string> 并添加一个具有空值的项目(在我的实际情况下它是一个变量)。

var testDictionary = new Dictionary<string, string>();
testDictionary.Add("Test", null);

这会导致警告“可能对标有 'NotNull' 属性的实体进行 'null' 分配”。

如果我让 ReSharper 将其转换为 Collection Initializer,它不会显示任何警告。

var testDictionary = new Dictionary<string, string> {{"Test", null}};

那么,字典的 Value 是否被标记为 ‘NotNull’ 属性?还是发生了其他事情?

编辑:这个问题与Resharper: Possible null assignment to entity marked with notnull attribute 没有太大区别,但我的问题的答案不同(这是 R# 中的一个错误,向集合中添加空元素不是一个好主意)。

【问题讨论】:

标签: c# generics collections resharper


【解决方案1】:

一般来说,将null 元素放入集合中是一种不好的做法。使用集合的绝大多数代码假定集合中的值不是null。如果null 是一个有效的集合元素,它确实会使所有消费代码复杂化。

例如,你基本上需要写

foreach (var cur in theCollection) {
  if (cur.Value == null) {
    continue;
  }
  ...
}

对于这种特定情况,看起来 R# 缺少集合初始化器的情况。 null 出现在一个集合中绝对是出乎意料的。

为什么不用null 而不是String.Empty

【讨论】:

  • 是的,但只是“一般”。使用 null 值是不允许或不合理的。
  • 确实,亨克。 string.empty 和 null 之间有一个非常真实的逻辑区别。
  • @HenkHolterman 这当然是允许的,但我想说这也同样出乎意料。将 null 放在集合中违反了“不要让您的用户感到惊讶”规则恕我直言。
  • +1。 Null Object pattern 是重构设计时的一种选择。
  • +1 用于解释为什么将null 值放入集合中通常是个坏主意。但我觉得 Aakash 的回答更好地回答了我的问题。
【解决方案2】:

这是a bug, fixed in 6.0

所以,是的,其他正在发生 - 你需要升级你的 R# ;)

【讨论】:

  • 这是一个有趣的错误。如果不是,ReSharper 怎么会认为该实体被标记为 NotNull 属性?无论如何,你是对的。
  • 我认为 BCL 的外部注释可能曾经是手动生成的,所以它可能只是一个简单的数据错误。
【解决方案3】:

ReSharper 出现故障。如果要禁用警告,您可以编辑使用菜单以检查“可能为空...”的选项并将其更改为不显示。

代码非常好,虽然我无法想象你为什么要添加 null(通常指向糟糕的设计/算法,但有一种更简洁的方法可以做到这一点)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2011-05-21
    • 2017-01-09
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多