2016-10-24 7 views
1

R#は、次のコードで可能null参照検出されたように見えます:importedDoc.RootプロパティにアクセスするとXDocument.Root:可能System.NullReferenceException

var importedDoc = XDocument.Parse(importedXml); 
var importedElements = importedDoc.Root.Elements().ToList(); 

を。厄介なことは、私のメソッドをユニットテストしたいが、結果としてXDocument.RootNullReferenceExceptionを投げるように、importedXmlを渡すことができないということです。私はそれがそうであると私はその枝をカバーしたい場合は、例外をスローするようにヌルチェックコードを追加しました:

if (importedDoc.Root == null) 
    throw new NullReferenceException("There is no root element"); 

誰もこれが起こるのか、そうでない場合にする方法を提供することができ、少なくともRない方法を説明します#このコードの警告が表示されますか? Rootプロパティに[NotNull]と表示されていますXDocumentを構成する方法が異なる可能性があります。Rootは実際にはnullですか?もしそうならば、これはSystem.Xml.Linqのバグではありませんか?

答えて

2

resharperは、どのタイプのランタイムチェックについても知らないXDocument.Parseは、ルートレベル要素が確実に存在するかどうかを確認することはできません。ヌルを返す可能性のある関数の呼び出しとしてはXDocument.Parseがあり、実際に返されたオブジェクトのメンバーを使用するnull条件をテストする必要があることがわかります。 XDocument.Parseが、その場合には、解析を行う際にスローされますので、importedDoc.Root以来

現実的にnullにすることはできません、あなたはコメント

// ReSharper disable once PossibleNullReferenceException 
var importedElements = importedDoc.Root.Elements().ToList(); 

でReSharperの警告をオフにするか、またはあなただけ追加することができますヌルチェック自分自身とあなたはReSharperのを幸せにするために、次のようにしたい場合は、例外を再提起:

var importedDoc = XDocument.Parse(importedXml); 
var importedElements = importedDoc?.Root?.Elements().ToList() ?? new List<XElement>(); 

if (importedElements.Count == 0) throw new InvalidOperationException("No root"); 

か、完全にこの特定の警告は、このシナリオでは、完全に有効ではないことを知っ全体を無視することができます。

0

この警告が表示される具体的な理由は、XDocument.RootのR#の外部注釈ではnullになる可能性があるということです。 R#s external annotations are open-sourced、あなた自身のために項目here on github(執筆の時点でライン214)を見ることができます。

さて、この特定のコードパスで(Parse経由XDocumentを作成する)、逆コンパイルコードの検査は、それがRootが後nullであることを発見した場合XDocument.Loadがスローされますので、チエニル場合でRootは、nullなることはありませんことを明らかにするロードが完了しました。それはRootが決してnullであることを意味することはありません。したがって、一回限りのR#警告抑制が最も適切と思われます。

関連する問題