2009-09-17 114 views
17

這工作得很好:意外的異常

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

但是如果我把它改爲通過「參數數組」明確作爲數組:

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

當您使用第一種方法時,您正在使用XDocument的重載,它首先接受XDeclaration,然後使用參數傳遞內容。但是,當您使用第二種方法時,您使用的是重載內容的參數。你的object []數組中的XDeclaration作爲內容來傳遞,這就是它炸燬的地方。

在這裏看到:http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.xdocument.aspx

+0

我看;我沒有意識到我正在調用不同的超載。似乎有點不幸的是'XDocument(object [])'接受各種對象,但由於某種原因排除了XDeclaration。 – 2009-09-17 13:59:37

+0

我想知道如果有機會,語言設計師現在是否會改變'params'參數的實現。這是一個非顯而易見的陷阱,如果可以明確指出您以某種方式在呼叫站點傳遞可變參數,那麼將避免這種陷阱。 – 2012-08-16 12:03:47

21

如果使用XDocument構造函數,而不是工廠方法可以分析XML字符串時出現此錯誤。

考慮:

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

這種失敗:

var doc = new XDocument(xmlString); 

這工作:

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

這就是我所遇到的問題。謝謝德魯! – 2014-05-23 19:13:57