我对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();
我的做法有问题吗?
谢谢!
答案 0 :(得分:3)
你的方法没有错。这是由ReSharper的外部注释引起的。 IEnumerable<T>.GetEnumerator()
标有[NotNullAttribute]
。但是,ConcurrentBag<T>
的{{1}}实现不是。
ReSharper看到IEnumerable
不能为空,并在看到MyClass.GetEnumerator()
没有相同的约束时发出警告。
你可以
“禁止检查”可能'null'赋值[...]并带有注释“
_items.GetEnumerator()
将// ReSharper disable AssignNullToNotNullAttribute
return _items.GetEnumerator(); // AssignNullToNotNull
// ReSharper restore AssignNullToNotNullAttribute
更改为_items
在private readonly IEnumerable<Item> _items
_items.GetEnumerator()