【问题标题】:Resharper ConcurrentBag<T> AssignNullToNotNull, but not with List<T>Resharper ConcurrentBag<T> AssignNullToNotNull,但不使用 List<T>
【发布时间】:2023-04-11 03:45:01
【问题描述】:

我对 ConcurrentBag&lt;T&gt;List&lt;T&gt; 作为存储一些值的底层集合存在理解问题。

我正在编写一个应该是可枚举的类,我想遍历底层 ConcurrentBag&lt;T&gt;,但 ReSharper 告诉我 return _items.GetEnumerator(); 是:

可能对标有“NotNull”属性的实体进行“空”赋值

这是什么原因?

代码示例:

public class MyClass : IEnumerable<Item> {
    private readonly ConcurrentBag<Item> _items;

    public MyClass() {
        _items = new ConcurrentBag<Item>();
    }

    public IEnumerator<Item> GetEnumerator() {
        if(_items == null)
            throw new InvalidOperationException("Error.");
        return _items.GetEnumerator(); // AssignNullToNotNull
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}

ReSharper 告诉我一切都很好:

  • List&lt;T&gt; 而不是 ConcurrentBag&lt;T&gt;
  • return ((IEnumerable&lt;ITranslationItem&gt;)_items).GetEnumerator();

我的方法有问题吗?

谢谢!

【问题讨论】:

    标签: c# .net generics resharper ienumerable


    【解决方案1】:

    你的方法没有错。这是由 ReSharper 的外部注释引起的。 IEnumerable&lt;T&gt;.GetEnumerator() 标有[NotNullAttribute]。但是,IEnumerableConcurrentBag&lt;T&gt; 实现不是。

    ReSharper 发现 MyClass.GetEnumerator() 不能为 null,并在发现 _items.GetEnumerator() 没有相同的约束时引发警告。

    你可以

    1. “禁止检查“可能的“空”赋值 [...] 并带有注释”

      // ReSharper disable AssignNullToNotNullAttribute
          return _items.GetEnumerator(); // AssignNullToNotNull
      // ReSharper restore AssignNullToNotNullAttribute
      
    2. _items更改为private readonly IEnumerable&lt;Item&gt; _items

    3. _items.GetEnumerator()上添加一个空检查

      IEnumerator<Item> retVal = _items.GetEnumerator();
      if (retVal == null)
          throw new InvalidOperationException("Error.");
      return retVal;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多