Resharper ConcurrentBag <t> AssignNullToNotNull,但不包含List <t> </t> </t>

时间:2012-03-19 15:57:58

标签: c# .net generics resharper ienumerable

我对ConcurrentBag<T>List<T>的理解问题是一个用于存储某些值的底层集合。

我正在编写一个应该可枚举的类,我想迭代底层ConcurrentBag<T>,但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<T>代替ConcurrentBag<T>
  • return ((IEnumerable<ITranslationItem>)_items).GetEnumerator();

我的做法有问题吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

你的方法没有错。这是由ReSharper的外部注释引起的。 IEnumerable<T>.GetEnumerator()标有[NotNullAttribute]。但是,ConcurrentBag<T>的{​​{1}}实现不是。

ReSharper看到IEnumerable不能为空,并在看到MyClass.GetEnumerator()没有相同的约束时发出警告。

你可以

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

    _items.GetEnumerator()
  2. // ReSharper disable AssignNullToNotNullAttribute return _items.GetEnumerator(); // AssignNullToNotNull // ReSharper restore AssignNullToNotNullAttribute 更改为_items

  3. private readonly IEnumerable<Item> _items

    上添加空检查
    _items.GetEnumerator()