2009-01-29 6 views
4

Je fais exactement la même chose dans deux classes, et dans un le compilateur le permet très bien, mais l'autre me donne une erreur. Pourquoi le double standard? Il y a 15 classes en utilisant ce même modèle, mais seulement on refuse de compiler, en disant l'erreur suivante:C# double standard?

'AWWAInvoicingXML.AwwaTransmissionInfo' does not implement interface member 'AWWAInvoicingXML.IXmlSerializable.fromXML(System.Xml.XmlDocumentFragment)'. 'AWWAInvoicingXML.AwwaTransmissionInfo.fromXML(System.Xml.XmlDocumentFragment)' is either static, not public, or has the wrong return type.

Voici mon code source ... si je commente la classe AwwaTransmissionInfo, le reste du fichier compile bien, donc je sais que ce n'est pas un de ceux où le compilateur est juste en train de mourir après la première erreur. Et je sais, je sais, il y a des trucs intégrés pour ce que j'essaie de faire ici, mais supposons que je sache ce que je fais et que je saute les sérialiseurs intégrés pour une raison :)

public interface IXmlSerializable { 
    //if this interface is implemented, the object can be serialized to XML 
    string toXML(); 
    IXmlSerializable fromXML(XmlDocumentFragment inXml); 
} 

public class AwwaTransmissionInfo : IXmlSerializable { 

    public DateTime DateTime = DateTime.Now; 
    public int ItemCount; 

    public string toXML() { 
     throw new Exception("The method or operation is not implemented."); 
    } 

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) { 
     throw new Exception("The method or operation is not implemented."); 
    } 

} 

public class CEmail { 
    public string Email = ""; 

    public string toXML() { 
     throw new System.Exception("The method or operation is not implemented."); 
    } 

    public CEmail fromXML(XmlDocumentFragment inXml) { 
     throw new System.Exception("The method or operation is not implemented."); 
    } 
} 
+0

CEmail n'est pas marqué comme implémentant IXmlSerializable. Est-ce intentionnel? – Rob

+0

Bang vous l'avez eu ... OMG J'ai regardé cela pendant longtemps sans m'en rendre compte! Poster comme une réponse, donc je peux vous donner les points :) – Jasmine

+0

Cas classique de ne pas voir les arbres pour la forêt. =) –

Répondre

1

La raison pour laquelle la classe CEmail compilait correctement est qu'elle n'était pas marquée comme implémentant l'interface. Quand je l'ai marqué comme tel, j'ai eu la même erreur que l'autre classe. Ce qui suit est comme ça doit être ... Je suis assez stupide pour ne pas le remarquer. Nous subissons beaucoup de pression en ce moment et je n'arrive pas à croire que j'ai regardé ce code pendant une heure avant de poser une question, et c'était quelque chose de si simple ... je l'imagine toujours :)

public interface IXmlSerializable { 
    //if this interface is implemented, the object can be serialized to XML 
    string toXML(); 
    IXmlSerializable fromXML(XmlDocumentFragment inXml); 
} 

public class AwwaTransmissionInfo : IXmlSerializable { 

    public DateTime DateTime = DateTime.Now; 
    public int ItemCount; 

    public string toXML() { 
     throw new Exception("The method or operation is not implemented."); 
    } 

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) { 
     throw new Exception("The method or operation is not implemented."); 
    } 

} 

public class CEmail : **IXmlSerializable** { 
    public string Email = ""; 

    public string toXML() { 
     throw new System.Exception("The method or operation is not implemented."); 
    } 

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) { 
     throw new System.Exception("The method or operation is not implemented."); 
    } 
} 
1

AwwaTransmissionInfo.fromXml doit renvoyer un type IXmlSerializable et non AwwaTransmissionInfo.

+0

Oui, mais comme vous pouvez le voir, AwwaTransmissionInfo implémente IXmlSerializable, donc ça DOIT fonctionner ... – BFree

+0

"Rob" posté la réponse correcte d'abord ... J'ai oublié d'implémenter l'interface. C'est une question stupide - j'ai vraiment foiré. Je suis sous un peu de pression aujourd'hui :) – Jasmine

+0

J'ai aussi voté celui-ci, car comme vous pouvez le voir, la fonction dans les deux classes retourne un type "self". – Jasmine

0

Votre classe CEmail n'implémente pas du tout l'interface IXmlSerializable. Implémentez-le et modifiez également le type de retour de votre CEmail et AWwaTransmissionInfo de XML à IXmlSerializable.

public IXmlSerializable fromXML(XmlDocumentFragment inXml){ 
    throw new System.Exception("The method..."); 
} 
10

Le problème est que la signature de méthode doit correspondre exactement à l'interface.

La solution la plus simple est de changer

public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) { 

à

public IXmlSerializable fromXML(XmlDocumentFragment inXml) { 

Si vous n'êtes pas satisfait, vous pouvez mettre en œuvre explicitement l'interface. Ajouter ceci:

public IXmlSerializable IXmlSerializable.fromXML(XmlDocumentFragment inXml) { 
     return this.fromXML(inXml); 
    } 

Ensuite, vous aurez deux définitions pour fromXML(), l'un pour être utilisé comme étant appelé comme instance de la classe, et un pour être utilisé appelé par l'interface.

0

La méthode "fromXml" de la classe AwwaTransmissionInfo dérivée retourne le type AwwaTransmissionInfo, où l'interface définit que la méthode doit renvoyer le type IXmlSerializable. Depuis AwwaTransmissionInfo dérive de IXmlSerializable, vous penseriez, oh, cool, cela fonctionne, mais pas sur une interface. Je pense que ce serait la variance (contra ou co-, je ne peux jamais me souvenir de laquelle)?

Si vous reformuliez ceci en utilisant des génériques, vous pourriez utiliser une contrainte qui vous permettrait d'en contourner certaines. IXmlSerializable existe déjà dans le framework .NET.

+0

sainte merde, vous êtes tous rapides! ;-) –

2

Je vous conseillerais de l'implémenter avant de partir vous-même et de réinventer la roue.

Voir msdn 1.

Quant à la raison pour laquelle votre code ne compilera pas:

La méthode fromXml doit revenir IXmlSerializable.

public IXmlSerializable fromXML(XmlDocumentFragment inXml) 
{ 
    throw new Exception("The method or operation is not implemented."); 
} 

Si vous voulez retourner quelque chose d'autre, pensez à utiliser une interface générique.

IE.

public interface IXmlSerializable<T> 
{ 
    //if this interface is implemented, the object can be serialized to XML 
    string toXML(); 
    T fromXML(XmlDocumentFragment inXml); 
} 

public class AwwaTransmissionInfo : IXmlSerializable<AwwaTransmissionInfo> 
{ 

    public DateTime DateTime = DateTime.Now; 
    public int ItemCount; 

    public string toXML() 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 
+0

DUH - peut-être que vous pourriez lire la question la prochaine fois. Mon problème ici est encore plus stupide que de ne pas utiliser de trucs intégrés. – Jasmine

+0

Ouais et vous êtes une bite. J'espère que je me souviendrai de ne pas essayer de vous aider dans le futur. –

+0

J'ai spécifiquement mentionné que je sais à ce sujet ... mais j'aime votre idée sur le générique, alors j'ai changé mon vote. Merci :) – Jasmine