3

[注: これはCompare string to null - なぜ Resharper はこれが常に false であると考えるのですか? 、しかしソースからは、 には[NotNull]属性がないようですMailMessage.From。]

次の方法を検討してください。

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

mailMessage.FromReSharper 7.1.1 は、null にすることはできないと警告しています。私はこれに完全に困惑しています。

mailMessage.Fromクラス(構造体ではMailAddressない)であるため、間違いなくnullになる可能性があると思います(ただし、メッセージが送信された時点では決してそうであってはなりません)。

これは、私が取得している ReSharper ツールチップを示す画像です。

mailMessage.From == null が常に false であることを示す ReSharper

ReSharper 7.1mailMessage.Fromが null にできないと考える理由、またはこれはバグですか?

アップデート

ということで、話が肥大化…

いくつかのテストを書いたところ、予期しない結果が得られました。

このテストは失敗します:

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

そして、これは合格します:

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

MailMessage.Fromしたがって、ReSharper はnull にできないという単純な間違いのようです。

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>

ご覧のとおりNotNullAttributeMailAddressクラスに を追加しています。

于 2012-12-30T23:44:55.153 に答える
3

これは ReSharper アノテーションのバグです。.netFramework 4.0 では、このプロパティはセッターで null 値をチェックしますが、MailMessage クラスのデフォルト コンストラクターでは null 以外の値は保証されません。その問題を記録しました:http://youtrack.jetbrains.com/issue/RSRP-337152

于 2013-01-10T09:49:51.127 に答える