Подтвердить что ты не робот

Как сообщить Resharper, что мой метод IEnumerable удаляет нули?

Учитывая следующий код, Resharper правильно предупредит меня о возможном NullReferenceException на foo.Bar, потому что в перечисляемом могут быть нулевые элементы:

IEnumerable<Foo> foos = GetFoos();
var bars = foos.Select(foo => foo.Bar);

Один из способов удовлетворить статический анализатор - явно исключить null:

IEnumerable<Foo> foos = GetFoos().Where(foo => foo != null);

Я нахожу, что набираю .Where(x => x != null) много, поэтому я завернул его в метод расширения, и теперь могу сделать следующее:

IEnumerable<Foo> foos = GetFoos().NotNull();

Проблема заключается в том, что Resharper не знает, что NotNull() удаляет нули. Есть ли способ научить Решарпера об этом факте? В общем, есть ли способ сказать Resharper, что метод IEnumerable -returning никогда не будет иметь нулей в нем (так что я могу просто аннотировать GetFoos() напрямую)?

Я знаю, что могу использовать NotNullAttribute, чтобы сообщить Resharper, что перечисляемый сам не является нулевым, но я не могу найти тот, который говорит о содержании перечислимый.

Изменить: Метод расширения выглядит точно так, как вы ожидали:

[NotNull]
public static IEnumerable<T> NotNull<T>(this IEnumerable<T> enumerable)
{   
    return enumerable.Where(x => x != null);
}
4b9b3361

Ответ 1

Вы можете использовать ItemNotNullAttribute, который сообщает ReSharper, что никакие элементы в коллекции никогда не могут быть null.

Ответ 2

Один из способов, как вы заявили, - использовать атрибут [NotNull], который инструктирует механизм Resharper прекратить проверку нулевой ссылочной ошибки для этой конкретной переменной.

Или, если вы не хотите использовать этот атрибут, вы можете использовать комментарии

// ReSharper disable PossibleNullReferenceException
        var bars = foos.Select(foo => foo.Bar);
// ReSharper restore PossibleNullReferenceException

Чтобы указать на этот вопрос, Resharper не может пройти через вычисляемые значения выполнения команд, чтобы он мог сделать вывод, что он не может быть нулевым.