[注意:这与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 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
不能为空。
答案 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