2009-09-17 19 views
17

Questo funziona bene:Eccezione imprevista dal costruttore XDocument

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

Tuttavia se cambio a passare la "matrice params" esplicitamente come un array:

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

non riesce con:

System.ArgumentException: non è possibile aggiungere caratteri non spazi bianchi al contenuto.

Questi due esempi non sono esattamente equivalenti? Cosa sta succedendo qui?

risposta

14

Quando si utilizza il primo metodo, si utilizza il sovraccarico di XDocument che richiede prima una XDeclaration e quindi un parametro per il contenuto. Tuttavia, quando si utilizza il secondo approccio, si utilizza il sovraccarico che richiede un parametro per il contenuto. La XDeclaration nell'array object [] sta arrivando come contenuto, ed è qui che sta esplodendo.

vedere qui: http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.xdocument.aspx

+0

vedo; Non mi rendevo conto che stavo chiamando diversi sovraccarichi. Sembra un po 'sfortunato che 'XDocument (object [])' accetti tutti i tipi di oggetti ma per qualche ragione esclude XDeclaration. –

+0

Mi chiedo se i progettisti linguistici possano cambiare l'implementazione degli argomenti 'params' ora se ne hanno la possibilità. Questo è un trabocchetto non ovvio che verrebbe evitato se fosse indicato esplicitamente che stai passando vararg sul sito di chiamata in qualche modo.ll –

21

È possibile ottenere questo errore quando si analizzano le stringhe XML se si utilizza il costruttore XDocument invece di un metodo di fabbrica.

Data:

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

questo non funziona:

var doc = new XDocument(xmlString); 

Questo funziona:

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

Questo era ESATTAMENTE il problema che stavo avendo. Grazie Drew! –

Problemi correlati