Компилятор не может выбрать перегрузку между интерфейсом и исключением - PullRequest
1 голос
/ 07 октября 2008

Попытка использовать класс исключения, который мог бы предоставить ссылку на местоположение для синтаксического анализа XML, показала интересное поведение - компилятор не мог выбирать между перегрузкой, которая использует интерфейс, и той, которая требует System.Exception, когда я пытаюсь передать XmlReader в качестве параметра.

Detais следующие:

//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);

И он терпит неудачу, так как не может выбрать правильную перегрузку. Но почему? Мы видим, что XmlReader поддерживает интерфейс и не наследуется от System.Exception

Ответы [ 5 ]

1 голос
/ 07 октября 2008

Линия:

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

потому что XmlReader не реализует IXmlLineInfo. Я не уверен, работает ли ваш актерский состав, но акты не проверяются статически. Если это действительно работает, то это потому, что конкретный класс (который наследуется от XmlReader) реализует этот интерфейс, но компилятор не может его узнать.

0 голосов
/ 07 октября 2008

Спасибо за ответы.

Я понял, что базовый класс не реализует IXmlLineInfo.

Но на самом деле я использовал XmlTextReader.Create, чтобы получить экземпляр фактического читателя.

Итак, я полагаю, что реальное решение - использовать конструктор XmlTextReader вместо заводского метода, чтобы предотвратить такую ​​путаницу

0 голосов
/ 07 октября 2008

Вы пропустили критическую часть:

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

Вы вызываете метод, который возвращает XmlTextReader, но тип вашей переменной XmlReader.

Приведение происходит во время выполнения, поэтому значение reader может быть приведено к IXmlLineInfo, поскольку XmlTextReader поддерживает этот интерфейс, даже если XmlReader нет.

Восстановление при перегрузке происходит во время компиляции, поэтому, поскольку XmlReader не поддерживает IXmlLineInfo, его нельзя сопоставить с сигнатурой.

Вы можете исправить это, написав:

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

Обратите внимание, что вам нужен приведение, потому что тип возвращаемого значения Create равен XmlReader, даже если он действительно возвращает XmlTextReader.

0 голосов
/ 07 октября 2008

Похоже, что XmlTextReader реализует IXmlLineInfo, а не XmlReader

http://msdn.microsoft.com/en-us/library/system.xml.ixmllineinfo(VS.71).aspx

0 голосов
/ 07 октября 2008

Не удалось выбрать перегрузку для вызова XmlReader, поскольку ни перегрузка не допустима. XmlReader не наследуется от Exception, поэтому первый вызов недопустим. XmlReader также не реализует IXmlLineInfo.

Причина, по которой это работает во втором случае, заключается в том, что вы заставляете актеров. Тем не менее, я считаю, что если вы действительно запустите этот код, он выдаст исключение InvalidCastException. Прочтите документацию по XmlReader, и вы увидите, что единственный реализуемый интерфейс - IDispoable.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...