Не удалось вызвать 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()?