Не удалось вызвать Dispose?
Этот меня немного смутил... Попытка избавиться от XmlReader
XmlReader reader = XmlReader.Create(filePath);
reader.Dispose();
Предоставляет следующую ошибку:
'System.Xml.XmlReader.Dispose(bool)' недоступен из-за его уровень защиты
однако все в порядке:
using(XmlReader reader = XmlReader.Create(filePath))
{
}
Когда я смотрю на определение в Reflector, я не понимаю, почему я не могу вызвать Dispose
![XmlReader]()
Реализация утилиты:
![Dispose]()
Может ли кто-нибудь указать, что мне не хватает?
Ответы
Ответ 1
Проблема заключается в том, что XmlReader
использует явную реализацию интерфейса для реализовать IDisposable
. Поэтому вы можете написать:
XmlReader reader = XmlReader.Create(filePath);
((IDisposable)reader).Dispose();
Однако я бы настоятельно рекомендовал использовать оператор using
в любом случае. Очень редко вы вызываете Dispose
явно, кроме как в другой реализации Dispose
.
EDIT: Как уже отмечалось, это "исправлено" в .NET 4.5, поскольку оно предоставляет открытый без параметров Dispose
метод с момента .NET 4.5, а также явную реализацию интерфейса. Предположительно, вы компилируете против .NET 4.0 или ранее (возможно,.NET 2.0 с учетом ваших тегов), но используя Reflector против .NET 4.5?
Ответ 2
using(XmlReader reader = XmlReader.Create(filePath))
{
foo(reader);
}
в точности эквивалентно
XmlReader reader = XmlReader.Create(filePath);
try
{
code(reader);
}
finally
{
if(reader != null)
((IDisposable)reader).Dispose();
}
Скорее всего, вы не разместили весь свой код - возможно, кто-то еще вызывает Dispose() на вашем объекте, вызывая исключение во втором вызове Dispose()?