3

[注意:这类似于将字符串与 null 比较 - 为什么 Resharper 认为这总是错误的?,但从来源来看,似乎没有[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.FromMailAddress一个类(不是结构),所以我认为它肯定可以为空(尽管我承认它肯定不应该在发送消息时出现)。

这是一张显示我得到的 ReSharper 工具提示的图像:

ReSharper 指示 mailMessage.From == null 始终为 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不能为空。

4

2 回答 2

3

根据文档,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

于 2012-12-30T23:44:55.153 回答
3

这是 ReSharper 注释中的一个错误。在 .netFramework 4.0 中,此属性在其设置器中检查空值,但在 MailMessage 类的默认构造函数中不保证非空值。我为此记录了一个问题:http: //youtrack.jetbrains.com/issue/RSRP-337152

于 2013-01-10T09:49:51.127 回答