我正在尝试创建一个通用方法来处理实现IDisposable的对象,称为DisposeObject()
为了确保我正在处理由原始引用指向的对象,我试图通过引用传递一个对象。
但我收到一个编译错误,上面写着
'ref' 参数类型与参数类型不匹配
在下面的(简化的)代码中,两者都_Baz
实现_Bar
了IDisposable。
所以问题是,
- 为什么我会收到此错误?
- 有没有办法绕过它?
[更新]
从目前提供的答案来看,只要我不将 IDisposable 参数设置为 null,我就可以简单地按值传递对象,而无需使用ref
. 我现在遇到了另一个麻烦,是否null
在DisposeObject
方法内设置一次性对象。
以下是完整性的完整来源:
public class Foo : IDisposable
{
private Bar _Bar;
private Baz _Baz;
private bool _IsDisposed;
~Foo() { Dispose(false); }
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(ref _Baz);
DisposeObject(ref _Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(ref IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
obj = null;
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
public class Bar : IDisposable
{
public void Dispose() {}
}
public class Baz : IDisposable
{
public void Dispose() {}
}
[结果]
我删除了将参数设置为 null ( obj = null;
)的代码,DisposeObject
所以最终的代码变成了。
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(_Baz);
DisposeObject(_Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}