2016-10-24 1 views
1

는 :XDocument.Root : 가능한 System.NullReferenceException R 번호는 다음 코드 가능한 널 레퍼런스를 검출되어 마치

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

하면 importedDoc.Root 속성을 액세스 할 때. 어색한 것은 이제 내 메서드를 단위 테스트하고 싶지만 XDocument.RootNullReferenceException을 throw하도록 importedXml을 전달할 수 없다는 것입니다. 나는 그런 경우 예외를 던져 널 검사 코드를 추가하고 그 지점을 포함 할 :

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

사람이 적어도 R 않는 방법을 설명하지 않을 경우이 일어날 또는 만들 수있는 방법을 제공 할 수 #이 코드 경고가 떠오른다? Root 속성은 다른 방법이있을 수 있기 때문에 가 [NOTNULL]Root 실제로 nullXDocument를 구성하는 표시되지 않는 이유는 무엇입니까? 그렇다면 System.Xml.Linq의 버그가 아닙니까?

답변

2

resharper는 모든 유형의 런타임 검사에 대해 알지 못합니다. XDocument.Parse은 루트 레벨 요소가 있는지 확인하기 위해 수행 될 수도 있고 수행되지 않을 수도 있습니다. 그냥 XDocument.Parse이 null을 반환 할 수있는 함수를 호출하는 것으로 보이며 실제로 반환 된 객체의 멤버를 사용하는 null 조건을 테스트해야한다고 제안합니다. XDocument.Parse 그 경우 구문 분석을 수행 할 때 발생합니다 이후 importedDoc.Root 이후

현실적으로 null 일 수 없습니다, 당신은 코멘트

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

으로 ReSharper에서 경고를 해제 할 수 있습니다 또는 당신은 단지를 추가 할 수 있습니다 널 (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

이 경고를받는 구체적인 이유는 XDocument.Root에 대한 R #의 외부 주석이 null 일 수 있다고합니다. R#s external annotations are open-sourced, 너 자신을위한 품목을 볼 수있다 here on github (쓰기의 시점에 선 214).

자,이 특정 코드 경로에 (Parse 통해 XDocument을 만드는)는 디 컴파일 코드의 검사는 Root이 후 null 것을 발견하면 XDocument.Load 던져 때문에 THIE 경우에 Rootnull 할 수 없다는 밝혀 로드가 완료되었습니다. 그러나 그것은 Root이 절대로 null이 될 수 없다고 말하는 것이 아닙니다. 따라서 일회성 R # 경고 억제가 가장 적절하다고 판단됩니다.