Ответ 1
Да, есть. Вам необходимо использовать аннотации ReSharper для руководства анализом ReSharper. Вы уже используете [CanBeNull]
, чтобы они уже были определены в вашем проекте.
Тот, который вас заинтересует, ContractAnnotationAttribute
:
Контрактные аннотации позволяют определять ожидаемые выходные данные для заданных входов или, другими словами, определять зависимости между ссылочным типом и логическими аргументами функции и ее возвращаемого значения. Механизм контрактных аннотаций позволяет создавать API, которые можно было бы использовать проще и безопаснее.
Вот как вы его используете:
[ContractAnnotation("null => false")]
public static bool IsNotNullOrEmpty(this string value)
=> !string.IsNullOrEmpty(value);
Аргумент представляет собой карту возможных входов (null
, notnull
, true
, false
) для выходов (null
, notnull
, canbenull
, true
, false
, halt
):
Вот еще один пример:
[ContractAnnotation("foo: null => halt; bar: notnull => notnull")]
public string Frob(string foo, string bar)
означает, что декорированная функция никогда не вернется (или исключение), если вы передадите ее null
в параметр foo
и гарантирует, что она не вернет null
, если вы передадите ненулевое значение до bar
.
Документация описывает синтаксис более подробно.
Здесь что происходит без атрибута:
Предупреждение исчезает после его добавления: