2008-10-07 5 views
1

En essayant d'utiliser une classe d'excpetion qui pourrait fournir une référence de localisation pour l'analyse XML, un compilateur n'a pas pu choisir entre surcharger qui consomme une interface et qui a besoin de System.Exception lorsque j'essaie de transmettre XmlReader en tant que paramètre.Le compilateur n'a pas pu choisir une surcharge entre l'interface et l'exception

Detais suivent:

//exception overloads: 
public FilterXmlParseException(string message, Exception innerException) 
     : base(message, innerException) { } 
public FilterXmlParseException(string message, IXmlLineInfo lineInfo) {...} 

//Usage: 
XmlReader reader = ... 
IXmlLineInfo lineinfo = (IXmlLineInfo)reader; 

//fails 
throw new FilterXmlParseException("<Filter> element expected", reader); 

//ok 
throw new FilterXmlParseException("<Filter> element expected", lineinfo); 

Et il échoue, car il ne pouvait pas choisir correctement overload.But pourquoi? Nous voyons que XmlReader prend en charge une interface et il n'est pas héritée de System.Exception

Répondre

1

La ligne:

//fails 
throw new FilterXmlParseException("<Filter> element expected", reader); 

parce XmlReader ne met pas en œuvre IXmlLineInfo. Je ne suis pas sûr si votre distribution fonctionne, mais les moulages ne sont pas vérifiés statiquement. Si cela fonctionne réellement, c'est parce que la classe concrète (qui hérite de XmlReader) implémente cette interface, mais le compilateur n'a aucun moyen de le savoir.

0

Il n'a pas pu choisir une surcharge pour l'appel XmlReader car ni une surcharge n'est acceptable. XmlReader n'hérite pas d'Exception, donc le premier appel n'est pas valide. XmlReader n'implémente pas IXmlLineInfo.

La raison pour laquelle cela fonctionne dans le second cas est que vous forcez la distribution. Cependant, je crois que si vous deviez réellement exécuter ce code, il lancerait une exception InvalidCastException. Lisez la documentation sur XmlReader et vous verrez que la seule interface qu'il implémente est IDispoable.

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx

0

Vous avez quitté la partie critique:

XmlReader reader = XmlTextReader.Create(sreader, readerSettings); 

Vous appelez une méthode qui retourne un XmlTextReader, mais le type de votre variable est XmlReader.

coulée se produit lors de l'exécution, de sorte que la valeur d'exécution de reader peut être jeté à IXmlLineInfo, car XmlTextReader soutient cette interface, même si XmlReader ne marche pas.

La surcharge se produit au moment de la compilation, donc parce que XmlReader ne supporte pas IXmlLineInfo, il ne peut pas correspondre à la signature.

Vous pouvez le fixer par écrit:

XmlTextReader reader = (XmlTextReader)XmlTextReader.Create(sreader, readerSettings); 

Notez que vous avez besoin d'un casting parce que le type de retour de Create est XmlReader, même si elle retourne en fait un XmlTextReader.

+0

pas si simple vraiment, j'utilise XmlTextReader.Create (sreader, readerSettings) Et il me retourne XmlReader. Alors, comment pourrais-je être sûr qu'il supporte Line Info? Encore assez confus –

0

Merci pour les réponses. J'ai compris que la classe de base n'implémente pas IXmlLineInfo.

Mais vraiment j'utilisais XmlTextReader.Create pour obtenir une instance du lecteur réel.

Donc je suppose que la solution réelle est d'utiliser constructeur XmlTextReader au lieu de la méthode de l'usine pour empêcher une telle confusion

+0

Microsoft recommande d'utiliser la méthode Create: http://msdn.microsoft.com/fr-fr/library/9khb6435.aspx – JacquesB

Questions connexes