Resharper ConcurrentBag <T>AssignNullToNotNull, но не со списком <T> - PullRequest
0 голосов
/ 19 марта 2012

У меня проблема с пониманием 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 Ответ

3 голосов
/ 19 марта 2012

Нет ничего плохого в вашем подходе.Это вызвано внешними аннотациями ReSharper.IEnumerable<T>.GetEnumerator() помечено [NotNullAttribute].Однако реализация ConcurrentBag<T> для IEnumerable не является.

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;
    
...