2012-03-19 6 views
0

いくつかの値を格納する下位コレクションとして、ConcurrentBag<T>List<T>の理解に問題があります。Resharper ConcurrentBag <T> AssignNullToNotNull(リストではありません)<T>

私は可算であるべきクラスを書いていると私は、下地のConcurrentBag<T>を反復処理したいのですが、ReSharperのはreturn _items.GetEnumerator();があることを教えてください:

エンティティに対する可能な「NULL」の割り当ては、「NOTNULL」が付きます属性

この理由は何ですか?

コード例:

  • List<T>代わりのConcurrentBag<T>

    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はすべてがと罰金であることを私に伝えます。

  • return ((IEnumerable<ITranslationItem>)_items).GetEnumerator();

私のアプローチに何か問題ですか?

ありがとうございます!

答えて

3

あなたのアプローチに間違いはありません。これは、ReSharperの外部注釈によって引き起こされます。 IEnumerable<T>.GetEnumerator()[NotNullAttribute]とマークされています。ただしの実装はIEnumerableではありません。

ReSharperは、MyClass.GetEnumerator()はnullであってはならないとみなし、_items.GetEnumerator()に同じ制約がないことを確認すると警告を表示します。

あなたはどちらか

  1. private readonly IEnumerable<Item> _items

  2. 追加するコメント "

    // ReSharper disable AssignNullToNotNullAttribute 
        return _items.GetEnumerator(); // AssignNullToNotNull 
    // ReSharper restore AssignNullToNotNullAttribute 
    
  3. 変更_itemsで可能な 'NULL' の割り当て[...]「のための検査を抑制" することができますヌルチェックの場合_items.GetEnumerator()

    IEnumerator<Item> retVal = _items.GetEnumerator(); 
    if (retVal == null) 
        throw new InvalidOperationException("Error."); 
    return retVal; 
    
関連する問題