为什么ReSharper认为MailMessage.From不能为空?

时间:2012-12-30 23:37:12

标签: c# resharper resharper-7.1

[注意:这与Compare string to null - Why does Resharper think this is always false?类似,但从来源看,[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 indicating that mailMessage.From == null is always false

为什么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 个答案:

答案 0 :(得分:3)

根据the documentation,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类。

答案 1 :(得分:3)

这是ReSharper注释中的一个错误。在.netFramework 4.0中,此属性在其setter中检查了null值,但在MailMessage类的默认构造函数中没有非空值。我已经记录了一个问题:http://youtrack.jetbrains.com/issue/RSRP-337152