无法调用Dispose?

时间:2012-03-06 11:00:41

标签: .net c#-2.0

这个让我有点困惑......尝试处理XmlReader

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

提供以下错误:

  

'System.Xml.XmlReader.Dispose(bool)'因其无法访问   保护水平

然而,以下情况很好:

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

当我查看Reflector中的定义时,我无法理解为什么我不能调用Dispose

XmlReader

Dispose的实施:

Dispose

任何人都可以指出我缺少的东西吗?

2 个答案:

答案 0 :(得分:19)

问题是XmlReader使用显式接口实现implement IDisposable。所以你可以写:

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

但是,我强烈建议您使用using声明。除了在另一个Dispose实施中之外,您应该明确地调用Dispose 非常

编辑:如上所述,这在.NET 4.5中是“固定的”,因为它从.NET 4.5开始显示public parameterless Dispose method以及显式接口实现。所以大概是你正在编译.NET 4.0或更早版本(可能是.NET 2.0给出你的标签)但是使用Reflector对抗.NET 4.5?

答案 1 :(得分:-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()时导致异常?