Необходимо уточнить значение Resharper NotNullAttribute
Рассмотрим следующий код:
public static void Foo()
{
Bar(null);
}
public static void Bar([NotNull] string s)
{
if (s == null)
throw new ArgumentNullException("s");
}
Атрибут [NotNull]
используется на Bar
, чтобы сообщить вызывающим абонентам, что s
не должен быть нулевым. Это нормально работает, и я получаю предупреждение, когда передаю null в Bar
(возможно "null" присваивание сущности, помеченной атрибутом "NotNull" ).
Но это на самом деле не мешает мне передавать null, поэтому Bar
все равно должен проверить, имеет ли значение s
значение null. Итак, почему я также получаю предупреждение на if (s == null)
(выражение всегда ложно)?
Насколько я могу судить, этот атрибут имеет двусмысленное значение; в зависимости от контекста, это может означать две разные вещи:
- для вызывающего: не передавать нулевой аргумент
- для вызываемого: этот аргумент не равен null
Я правильно использую этот атрибут, или я что-то упускаю?
Кстати, я использую Resharper 7 EAP, так что это может быть ошибка; однако я хочу убедиться, что мое использование правильное, прежде чем сообщить об этом...
EDIT: попробовал то же самое с R # 5.1 на работе; он показывает предупреждение на сайте вызова, но не в методе. Я сообщу об этом на Jetbrain Youtrack.
EDIT2: сообщение об ошибке здесь
Ответы
Ответ 1
Насколько я могу судить, вы используете его правильно, и ReSharper неправильно говорит вам, что сравнение всегда false
. Атрибут [NotNull]
- это не более чем документация, и ваш код прав, чтобы дважды проверить входные значения. Решарпер не первый раз сделал неправильное или глупое предложение. Замечательная вещь о JetBrains заключается в том, что они публичный трекер ошибок, где вы можете сообщить об этом и получить обратную связь прямо от разработчиков.
Тем не менее, (и простите, если вы это знаете), С# 4.0 Code Contracts делает это легким, предсказуемым и надежно:
Contract.RequiresAlways(s != null);