C # двойной стандарт? - PullRequest
       12

C # двойной стандарт?

4 голосов
/ 30 января 2009

Я делаю одну и ту же вещь в двух классах, и в одном компилятор разрешает это просто отлично, но другой выдает мне ошибку. Почему двойной стандарт? Есть 15 классов, использующих этот же шаблон, но только один отказывается компилировать, говоря следующее сообщение об ошибке:

'AWWAInvoicingXML.AwwaTransmissionInfo' не реализует элемент интерфейса 'AWWAInvoicingXML.IXmlSerializable.fromXML (System.Xml.XmlDocumentFragment). 'AWWAInvoicingXML.AwwaTransmissionInfo.fromXML (System.Xml.XmlDocumentFragment)' либо статичен, не общедоступен, либо имеет неправильный тип возврата.

Вот мой исходный код ... если я закомментирую класс AwwaTransmissionInfo, остальная часть файла будет компилироваться нормально, поэтому я знаю, что это не тот из тех, где компилятор просто умирает после первой ошибки. И я знаю, я знаю, есть встроенные вещи для того, что я пытаюсь сделать здесь, но просто предположим, что я действительно знаю, что я делаю, и пропустил встроенные сериализаторы по причине:)

    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.");
    }
}

Ответы [ 6 ]

10 голосов
/ 30 января 2009

Проблема в том, что подпись метода должна точно соответствовать интерфейсу.

Самое простое решение - поменять

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) {

до

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) {

Если вы недовольны этим, вы можете явно реализовать интерфейс. Добавьте это:

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

Тогда у вас будет два определения для fromXML (), одно для использования при вызове в качестве экземпляра класса, и одно для использования при вызове через интерфейс.

2 голосов
/ 30 января 2009

IXmlSerializable уже существует в .NET Framework. Я бы посоветовал вам это реализовать, прежде чем отправляться самостоятельно и заново изобретать колесо.

См. MSDN 1 .

Что касается причины, по которой ваш код не будет компилироваться:

Метод fromXml должен возвращать IXmlSerializable.

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

Если вы хотите вернуть что-то еще, рассмотрите возможность использования универсального интерфейса.

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.");
    }
}
1 голос
/ 30 января 2009

Причина, по которой класс CEmail нормально компилировался, заключается в том, что он не был помечен как реализующий интерфейс. Когда я отметил его как таковой, я получил ту же ошибку, что и другой класс. Вот как это должно быть ... Я довольно глуп, что не заметил этого. Сейчас мы находимся под большим давлением, и я не могу поверить, что я смотрел на этот код примерно час, прежде чем отправил вопрос, и это было что-то настолько простое ... я всегда думаю:)

    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 голос
/ 30 января 2009

AwwaTransmissionInfo.fromXml должен возвращать тип IXmlSerializable, а не AwwaTransmissionInfo.

0 голосов
/ 30 января 2009

Метод fromXml производного класса AwwaTransmissionInfo возвращает тип AwwaTransmissionInfo, где в качестве интерфейса определяется, что метод должен возвращать тип IXmlSerializable. Поскольку AwwaTransmissionInfo является производным от IXmlSerializable, вы можете подумать, что это здорово, но это не работает в интерфейсе. Я думаю, что это будет дисперсия (против или совместно, я никогда не могу вспомнить, какой) ??

Если бы вы реорганизовали это с помощью обобщений, то вы могли бы использовать ограничение, которое позволило бы вам обойти некоторые из них.

0 голосов
/ 30 января 2009

Ваш класс CEmail вообще не реализует интерфейс IXmlSerializable. Внедрите его, а также измените тип возврата как вашей CEmail, так и AWwaTransmissionInfo с XML на IXmlSerializable.

public IXmlSerializable fromXML(XmlDocumentFragment inXml){
   throw new System.Exception("The method...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...