Question

[Note: This is similar to Compare string to null - Why does Resharper think this is always false?, but from the source, it appears there is no [NotNull] attribute on MailMessage.From.]

Consider this method:

public void Send(MailMessage mailMessage)
{
    if (mailMessage.From == null)
        mailMessage.From = new MailAddress(Settings.SmtpSettings.From);
    _smtpClient.Send(mailMessage);
}

ReSharper 7.1.1 is warning me that mailMessage.From cannot be null. I'm completely baffled by this.

mailMessage.From is a MailAddress which is a class (not a struct), so I would think it could definitely be null (although I concede it certainly shouldn't be at the time the message is sent).

Here is an image showing the ReSharper tooltip I'm getting:

ReSharper indicating that mailMessage.From == null is always false

Any explanation why ReSharper 7.1 thinks mailMessage.From cannot be null, or is this a bug?

Update

So the plot thickens...

I wrote a couple tests and got unexpected results.

This test fails:

[Test]
public void FromPropertyOfMailMessageCannotBeNull()
{
    var message = new MailMessage();
    Assert.IsNotNull(message.From);
}

And this one passes:

[Test]
public void FromPropertyOfMailMessageIsNullIfDefaultConstructorIsUsed()
{
    var message = new MailMessage();
    Assert.IsNull(message.From);
}

So, it looks like ReSharper is just plain wrong that MailMessage.From cannot be null.

Was it helpful?

Solution

It is a bug in ReSharper annotations. In .netFramework 4.0 this property has check for null value in it's setter but non-null value is not gauranted in the default constructor of MailMessage class. I've logged an issue for that: http://youtrack.jetbrains.com/issue/RSRP-337152

OTHER TIPS

According to the documentation, ReSharper allows NotNullAttribute to be applied to external APIs (such as the .NET framework itself.)

In \Program Files (x86)\JetBrains\ReSharper\v7.1\Bin\ExternalAnnotations\.NETFramework\System.Net\4.0.0.0.Nullness.Gen.xml

You have:

<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>

As you can see, it's adding the NotNullAttribute to the MailAddress class.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top