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

Необходимо уточнить значение 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: сообщение об ошибке здесь

4b9b3361

Ответ 1

Насколько я могу судить, вы используете его правильно, и ReSharper неправильно говорит вам, что сравнение всегда false. Атрибут [NotNull] - это не более чем документация, и ваш код прав, чтобы дважды проверить входные значения. Решарпер не первый раз сделал неправильное или глупое предложение. Замечательная вещь о JetBrains заключается в том, что они публичный трекер ошибок, где вы можете сообщить об этом и получить обратную связь прямо от разработчиков.

Тем не менее, (и простите, если вы это знаете), С# 4.0 Code Contracts делает это легким, предсказуемым и надежно:

Contract.RequiresAlways(s != null);