C# XDocument.Root:可能的System.NullReferenceException

C# XDocument.Root:可能的System.NullReferenceException,c#,linq-to-xml,resharper,C#,Linq To Xml,Resharper,看起来R#在以下代码中检测到可能的空引用: var importedDoc = XDocument.Parse(importedXml); var importedElements = importedDoc.Root.Elements().ToList(); 访问importedDoc.Root属性时。令人尴尬的是,现在我想对我的方法进行单元测试,但我无法传递importedXml,因此生成的XDocument.Root抛出NullReferenceException。我添加了空检查代码,以

看起来R#在以下代码中检测到可能的空引用:

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
中的一个bug吗?

resharper不知道任何类型的运行时检查
XDocument。解析
可以做,也可以不做,以确保有根级别的元素。它只是将
XDocument.Parse
视为对可能返回null的函数的调用,并建议您在实际使用返回对象的成员时测试null条件

由于
importedDoc.Root
实际上不能为null,因为在执行解析时XDocument.Parse将抛出。在这种情况下,您可以关闭带有注释的resharper警告

// ReSharper disable once PossibleNullReferenceException
var importedElements = importedDoc.Root.Elements().ToList();
或者,您可以自己添加空检查并重新引发异常,如果您希望这样做使resharper满意:

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

if (importedElements.Count == 0) throw new InvalidOperationException("No root");
var importedDoc=XDocument.Parse(importedXml);
var importedElements=importedDoc?.Root?.Elements().ToList()??新列表();
如果(importedElements.Count==0)抛出新的InvalidOperationException(“无根”);

或者,您可以完全忽略整个事件,因为您知道此特定警告在这种情况下并不完全有效。

您收到此警告的具体原因是R#的
XDocument.Root
外部注释说它可以为null,因此,您可以自己查看该项目(撰写本文时的第214行)

现在,在这个特定的代码路径中(通过
Parse
创建
XDocument
),对反编译代码的检查显示,在这种情况下
Root
永远不可能是
null
,因为
XDocument.Load
在加载完成后如果发现
Root
null
,就会抛出;但这并不是说
Root
永远不能
null
。因此,一次过的R#警告抑制似乎最合适