Почему 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 указывает, что mailMessage.From == ноль всегда ложно

Любое объяснение, почему 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 учебный класс.

Другие вопросы по тегам