我正在实现ICollection< T>,而且枚举器的实现也有问题。
我知道IEnumerator< T>必须实现IEnumerator以实现向后兼容性(.NET 1.0)
但是如果我实现的是IEnumerator< T >,那么就有两个当前属性。
我有两个问题:
,
T IEnumerator.Current { get { if (_cursor <0维希_cursor >= _array.Length)抛出新InvalidOperationException("Iterator位置无效“);否则返回_array_cursor;} object IEnumerator.Current { get {返回IEnumerator.Current;}
我得到了以下错误:非静态字段、方法或属性'System.Collections.Generic.IEnumerator.Current.get‘需要一个对象引用。
(2)。为什么IEnumerator< T>必须实现IDisposable。Dispose用于非托管资源,但是在一般情况下枚举器将使用非托管资源吗?
发布于 2011-05-30 09:54:56
在一些情况下,IEnumerator<T>从IDisposable继承是有用的。
例如,以File.ReadLines()为例,它需要保持打开一个FileStream,这是一个非托管资源。
或者,如果考虑使用yield syntax的迭代器,则需要IDisposable才能使finally子句正确工作:
IEnumerator<int> MyIt()
{
try
{
yield return 1;
}
finally
{
//Do Something
}
}通常,您会像这样实现Current:
T Current//Implicit interface implementation
{
get
{
return something;
}
}
object IEnumerator.Current{get{return Current;}}您的原始代码无法工作,因为您试图在接口本身上获得一个静态属性。你可能想去((IEnumerator<T>)this).Current。但是,如果您隐式地实现了T Current{...},则根本不需要这种强制转换。
发布于 2011-05-30 09:55:03
return ((IEnumerator<T>)this).Current;Dispose()用于告诉枚举器不再需要它(例如,您可以从某个数据源断开连接,或者做其他事情)。https://stackoverflow.com/questions/6174721
复制相似问题