Рассмотрим следующий код:
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)
(Выражение всегда ложно)?
Насколько я могу судить, этот атрибут имеет неоднозначное значение; в зависимости от контекста это может означать две разные вещи:
- для вызывающей стороны: не передавать пустой аргумент
- для вызываемого: этот аргумент не нулевой
Я правильно использую этот атрибут или что-то упускаю?
Кстати, я использую Resharper 7 EAP, так что это может быть ошибка; однако я хочу убедиться, что мое использование правильно, прежде чем сообщить об этом...
РЕДАКТИРОВАТЬ: только что попробовал то же самое с R # 5.1 на работе; он показывает предупреждение на сайте вызова, но не в методе. Я сообщу об этом на Youtrack Jetbrain.
EDIT2: ошибка сообщается здесь
null
? Возможно, v7 выполняет более глубокий анализ источника значений и видит, что в этом случае единственный вызывающийBar
передаетnull
... - person AakashM   schedule 22.05.2012