2009-09-17 15 views
17

Działa to dobrze:Nieoczekiwany wyjątek od konstruktora XDocument

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

Jednak jeśli zmienię go przekazać "tablicę params" jawnie jako tablica:

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

nie jest on z:

System.ArgumentException: Nie białe znaki spacji nie mogą być dodawane do treści.

Czy te dwa przykłady nie są dokładnie równoważne? Co tu się dzieje?

Odpowiedz

14

Kiedy używasz pierwszej metody, używasz przeciążenia XDocument, które najpierw pobiera XDeclaration, a następnie params dla treści. Jednak gdy używasz drugiego podejścia, używasz przeciążenia, które pobiera parametry dla zawartości. XDeclaration w twojej macierzy obiektów [] nadchodzi jako treść i właśnie tam się wysadza.

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

+0

widzę; Nie zdawałem sobie sprawy, że nazywam różne przeciążenia. To trochę niefortunne, że 'XDocument (object [])' akceptuje wszystkie rodzaje obiektów, ale z jakiegoś powodu wyklucza XDeclaration. –

+0

Zastanawiam się, czy projektanci języka zmieniliby implementację argumentów 'params' teraz, jeśli mieliby taką szansę. Jest to nieoczywista pułapka, której można by uniknąć, gdyby można było wyraźnie wskazać, że przekazujesz varargs na stronie połączenia w jakiś sposób.ll –

21

Można uzyskać ten błąd podczas analizowania XML ciągi jeśli użyć konstruktora XDocument zamiast metody fabryki.

Dane:

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

ta zawodzi:

var doc = new XDocument(xmlString); 

to działa:

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

To był DOKŁADNIE problem, który miałem. Dzięki Drew! –

Powiązane problemy