Почему ReSharper считает, что MailMessage.From не может быть нулевым?
[Примечание: это похоже на строку сравнения с нулем - почему Решарпер считает, что это всегда ложь?, но из источника, похоже, нет [NotNull]
атрибут на MailMessage.From
.]
Рассмотрим этот метод:
public void Send(MailMessage mailMessage)
{
if (mailMessage.From == null)
mailMessage.From = new MailAddress(Settings.SmtpSettings.From);
_smtpClient.Send(mailMessage);
}
ReSharper 7.1.1 предупреждает меня, что mailMessage.From
не может быть нулевым. Я полностью сбит с толку этим.
mailMessage.From
это MailAddress
это класс (не структура), поэтому я думаю, что он определенно может быть нулевым (хотя я допускаю, что это не должно быть во время отправки сообщения).
Вот изображение, показывающее подсказку ReSharper, которую я получаю:
Любое объяснение, почему ReSharper 7.1 думает mailMessage.From
не может быть нулем, или это ошибка?
Обновить
Так что сюжет утолщается...
Я написал пару тестов и получил неожиданные результаты.
Этот тест не проходит:
[Test]
public void FromPropertyOfMailMessageCannotBeNull()
{
var message = new MailMessage();
Assert.IsNotNull(message.From);
}
И этот проходит:
[Test]
public void FromPropertyOfMailMessageIsNullIfDefaultConstructorIsUsed()
{
var message = new MailMessage();
Assert.IsNull(message.From);
}
Итак, похоже, что ReSharper просто неправильно, что MailMessage.From
не может быть нулевым.
2 ответа
Это ошибка в аннотациях ReSharper. В.netFramework 4.0 это свойство имеет проверку на нулевое значение в своем установщике, но ненулевое значение не калибруется в конструкторе по умолчанию класса MailMessage. Я зарегистрировал проблему для этого: http://youtrack.jetbrains.com/issue/RSRP-337152
Согласно документации, ReSharper позволяет NotNullAttribute
для применения к внешним API-интерфейсам (таким как сама платформа.NET).
В \Program Files (x86)\JetBrains\ReSharper\v7.1\Bin\ExternalAnnotations\.NETFramework\System.Net\4.0.0.0.Nullness.Gen.xml
У тебя есть:
<member name="M:System.Net.PeerToPeer.Collaboration.PeerNearMe.AddToContactManager(System.String,System.String,System.Net.Mail.MailAddress)">
<attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
Как вы можете видеть, это добавляет NotNullAttribute
к MailAddress
учебный класс.