2009-09-17 7 views
17

이 잘 작동 :예기치 않은 예외가

XDocument xdoc = new XDocument(
    new XDeclaration("1.1", "UTF-8", "yes"), 
    new XProcessingInstruction("foo", "bar"), 
    new XElement("test")); 

을하지만 내가 그것을 변경하는 경우 명시 적으로 배열로서 "PARAMS 배열을"통과 :

:

object[] content = new object[] { 
    new XDeclaration("1.1", "UTF-8", "yes"), 
    new XProcessingInstruction("foo", "bar"), 
    new XElement("test") 
}; 
xdoc = new XDocument(content); 

그것은 실패

System.ArgumentException : 공백이 아닌 문자를 콘텐츠에 추가 할 수 없습니다.

이 두 예제가 정확히 일치하지 않습니까? 무슨 일 이니?

답변

14

첫 번째 방법을 사용하면 XDeclaration을 먼저 오버로드 한 다음 내용을 params로 가져 오는 오버로드를 사용하고 있습니다. 그러나 두 번째 접근법을 사용할 때 콘텐츠에 대한 매개 변수를 사용하는 오버로드를 사용하고 있습니다. 객체 [] 배열의 XDeclaration이 내용물을 통해 전달됩니다.

는 여기를 참조하십시오 : XML 문자열을 구문 분석 할 때 당신은 팩토리 메소드 대신 XDocument 생성자를 사용하는 경우 http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.xdocument.aspx

+0

; 나는 다른 과부하를 부르고 있다는 것을 몰랐다. 'XDocument (object [])'가 모든 종류의 객체를 받아들이지만 어떤 이유로 XDeclaration을 제외시키는 것은 약간 불행한 것 같습니다. –

+0

기회가 주어지면 언어 디자이너가'params' args의 구현을 변경할지 궁금합니다. 어떻게 든 호출 사이트에서 varargs를 전달하고 있음을 명시 적으로 나타낼 수 있다면이를 피할 수없는 비상 한 함정입니다 .ll –

21

당신이 오류를 얻을 수 있습니다.

을 감안할 때 :

var xmlString = "<some-xml />"; 

이 실패

var doc = new XDocument(xmlString); 

이 작동 : 내가 볼

var doc = XDocument.Parse(xmlString); 
+0

이것은 정확히 제가 겪었던 문제였습니다. 감사 드류! –