2016-10-24 58 views
1

它看起來像R#爲在下面的代碼檢測可能空引用:XDocument.Root:可能System.NullReferenceException

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

當訪問importedDoc.Root屬性。尷尬的是,現在我想單元測試我的方法,但我無法通過importedXml,因此產生的XDocument.Root拋出NullReferenceException。我已經加入空檢查代碼拋出異常,如果是這樣的話,我想覆蓋分支:

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的函數的調用,並建議您應測試實際使用返回對象成員的null條件。

因爲importedDoc.Root現實不能爲空,因爲XDocument.Parse將拋出在這種情況下做解析的時候,你可以關閉ReSharper的警告與評論

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

,或者你可以只添加null檢查自己,如果你想這樣做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

你得到這個警告的具體原因是R#的外部註釋XDocument.Root說它可以爲空。 R#s external annotations are open-sourced,所以你可以看到自己的項目here on github(寫214時的214行)。現在

,在這個特殊的代碼路徑(創建通過ParseXDocument),反編譯代碼的檢查表明,Root在thie情況下永遠不能null,因爲如果它發現RootnullXDocument.Load將拋出加載完成;但這並不是說Root永遠不會有null。因此,一次性R#警告抑制似乎是最合適的。