Ответ 1
Вы можете использовать ItemNotNullAttribute
, который сообщает ReSharper, что никакие элементы в коллекции никогда не могут быть null
.
Учитывая следующий код, 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);
}
Вы можете использовать ItemNotNullAttribute
, который сообщает ReSharper, что никакие элементы в коллекции никогда не могут быть null
.
Один из способов, как вы заявили, - использовать атрибут [NotNull], который инструктирует механизм Resharper прекратить проверку нулевой ссылочной ошибки для этой конкретной переменной.
Или, если вы не хотите использовать этот атрибут, вы можете использовать комментарии
// ReSharper disable PossibleNullReferenceException
var bars = foos.Select(foo => foo.Bar);
// ReSharper restore PossibleNullReferenceException
Чтобы указать на этот вопрос, Resharper не может пройти через вычисляемые значения выполнения команд, чтобы он мог сделать вывод, что он не может быть нулевым.