Рассмотрим следующий код:
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: сообщение об ошибке здесь