XDocument构造函数的意外异常。

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: 非空格字符不能添加到内容中。

这两个示例难道不是完全相同的吗?发生了什么事情?

2个回答

21

如果您使用XDocument构造函数而不是工厂方法,则在解析XML字符串时可能会出现此错误。

给定:

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

这个失败了:

var doc = new XDocument(xmlString);

这行代码是有效的:

var doc = XDocument.Parse(xmlString);

这正是我遇到的问题。谢谢你,Drew! - Mike K

14
当您使用第一种方法时,您使用的是XDocument的重载版本,该版本首先采用XDeclaration,然后采用内容参数。然而,当您使用第二种方法时,您使用的是采用内容参数的重载版本。您的object[]数组中的XDeclaration作为内容传递进来,这就是它失败的原因。
参见此处:http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.xdocument.aspx

我明白了,我没有意识到我在调用不同的重载。XDocument(object[])接受各种对象,但出于某种原因却排除了XDeclaration,这似乎有点不太合适。 - Wim Coenen
我想知道如果语言设计者有机会是否会改变params参数的实现方式。如果可以在调用时明确指出传递可变参数,那么这将避免一个非常不明显的陷阱。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接