C# XDocument.Root:可能的System.NullReferenceException
看起来R#在以下代码中检测到可能的空引用: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。我添加了空检查代码,以
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#警告抑制似乎最合适