Невозможно позвонить утилизировать? - PullRequest
12 голосов
/ 06 марта 2012

Это меня немного смутило ... Попытка избавиться от XmlReader

XmlReader reader = XmlReader.Create(filePath);
reader.Dispose();  

Предоставляет следующую ошибку:

'System.Xml.XmlReader.Dispose (bool)' недоступен из-за его уровень защиты

однако, все в порядке:

using(XmlReader reader = XmlReader.Create(filePath))
{
}

Когда я смотрю на определение в Reflector, я не могу понять, почему я не могу вызвать Dispose

XmlReader

Реализация утилизации:

Dispose

Кто-нибудь может указать, что мне не хватает?

Ответы [ 2 ]

19 голосов
/ 06 марта 2012

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

XmlReader reader = XmlReader.Create(filePath);
((IDisposable)reader).Dispose();

Тем не менее, я бы настоятельно рекомендовал использовать оператор using в любом случае. Вы должны очень редко, чтобы вы вызывали Dispose явно, кроме как внутри другой реализации Dispose.

РЕДАКТИРОВАТЬ: Как уже отмечалось, это "исправлено" в .NET 4.5, поскольку оно предоставляет открытый метод Dispose без параметров начиная с .NET 4.5, а также явную реализацию интерфейса. Так что, вероятно, вы компилируете против .NET 4.0 или более ранней версии (возможно, .NET 2.0 с учетом ваших тегов), но используете Reflector против .NET 4.5?

0 голосов
/ 06 марта 2012
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 ()?

...