2012-03-19 46 views
0

我对ConcurrentBag<T>List<T>有一个理解问题,作为存储某些值的底层集合。Resharper ConcurrentBag <T> AssignNullToNotNull,但不包含在列表中<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();

什么毛病我的方法?

谢谢!

回答

3

您的方法没有任何问题。这是由ReSharper的外部注释引起的。 IEnumerable<T>.GetEnumerator()标有[NotNullAttribute]。但IEnumerableConcurrentBag<T>不是。

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

您可以

  1. 与评论 “

    // ReSharper disable AssignNullToNotNullAttribute 
        return _items.GetEnumerator(); // AssignNullToNotNull 
    // ReSharper restore AssignNullToNotNullAttribute 
    
  2. 更改_items“禁止检查的” 可能 '空' 分配[...]到private readonly IEnumerable<Item> _items

  3. 添加空值检查_items.GetEnumerator()

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